php - एक रूटर का उपयोग करते हुए एकाधिक मार्गों(नियंत्रक) का मानचित्रण करना




design-patterns model-view-controller (3)

बूटस्ट्रैप चरण के हिस्से के रूप में अपने नियंत्रकों को एक रूटर पर खुद को मैप करने के लिए बताएं:

// bootstrap
$router = new AltoRouter();

FooController::mapRoutes($router);
BarController::mapRoutes($router);
// etc.

प्रत्येक नियंत्रक की जरूरत है, हालांकि कई मार्गों को तैयार करने की अनुमति है।

मैं डैनी वैंकूटन रूटर लाइब्रेरी को देख रहा हूं। यह अच्छा लगता है (हालांकि यह सुनिश्चित नहीं है कि यह कैसे माध्यम से बड़े, उदाहरण के एक ईकॉमर्स साइट से परियोजना को संभाल सकता है) उदाहरण के लिए, यह मैपिंग है

$router->map('GET','/', 'home.php', 'home');
$router->map('GET','/home/', 'home.php', 'home-home');
$router->map('GET','/plans/', 'plans.php', 'plans');
$router->map('GET','/about/', 'about.php', 'about');
$router->map('GET','/contact/', 'contact.php', 'contact');
$router->map('GET','/tos/', 'tos.html', 'tos');

मान लें कि मेरे पास एक ऐसा परिदृश्य है जहां मेरी वेबसाइट में 20-30 स्थिर पृष्ठ हैं या करीब 50 नियंत्रकों के पास 2-3 कार्रवाई / पद्धति प्रत्येक के साथ।

मैं उन सभी को कैसे मैप करता हूं अगर मैं मैपिंग की उपरोक्त विधि का उपयोग करता हूं, तो शायद मैं 100 से अधिक लाइन मानचित्रण करूँगा और यह सही नहीं लगता है।

मेरा मानना ​​है कि कोई रास्ता या शॉर्ट कट / वाइल्ड कार्ड होना चाहिए जैसे कि कोई पृष्ठ या नियंत्रक उपलब्ध है, फिर लोड करें या फिर 404 को फेंक दें।

मैं सभी मार्गों को सही तरीके से कैसे नक्शा कर सकता हूं?

पुनश्च। किसी भी व्यक्ति को 50 रुपये का उपहार देने के लिए जो कि वायर्ड कार्ड का उपयोग करने वाले नियंत्रक / विधि से मिलान करने के लिए कहा गया राउटर का उपयोग करने के बारे में जवाब देने के लिए तैयार है।


लाइब्रेरी में कोई फ़ंक्शन नहीं है जो आप की तरह कुछ करना चाहते हैं, लेकिन ऐसा करने का एक वैकल्पिक तरीका है, उन पेजों को डेटाबेस से संग्रहीत करना है, ताकि आप इस तरह से कुछ नीचे कर सकें

//your query
// "SELECT `method`, `route`, `page`, `name` FROM `static_pages`
$pages = (query); //your executed query
if(count($pages) > 0){
  foreach($pages as $page){
    $router->map($page['method'],$page['route'], $page['target'], (($page['name'] !== null || !empty($page['name']) ) ? $page['name'] : null));
  }
}

आशा है कि ये आपकी मदद करेगा


यदि आप शिलेक्स जैसे प्री-निर्मित राउटर का उपयोग करते हैं तो आप ऐसा कुछ कर सकते हैं:

$app->get('{route}', function($route) {
    $dir = "/path/to/my/static/files/";
    $file = $dir . $route . '.php';
    if (file_exists($file)) {
        require $file;
    } else {
        require '/path/to/custom/404.php';
    }
});

ध्यान दें कि सिलेक्स और कई समान रूटरों को वरीयता के क्रम से मार्गों की आवश्यकता होती है। जब मुझे इस तरह से एक राउटर का उपयोग करने की आवश्यकता है, तो मैं इसे नीचे रख दिया है ताकि यह गलती से किसी और चीज़ को पकड़ न सके।

ध्यान दें, यदि आप इस कस्टम की तरह कुछ बनाना चाहते हैं, तो आप ऐसा कर सकते हैं - ध्यान में रखते हुए मुझे पता नहीं है कि आपका कोड वर्तमान में कैसा लग रहा है या आपको किस तर्क की ज़रूरत है - अपनी नियमित अभिव्यक्ति (सिलेक्स के उदाहरण में, यह घुंघराले ब्रैकेट के साथ है) और आपके तैयार किए गए नियमित अभिव्यक्ति के खिलाफ $_SERVER['REQUEST_URI'] जांच कर रहा है

यदि यह एक कस्टम एप्लिकेशन है, तो आपको वास्तव में इस पर इंजीनियर की ज़रूरत नहीं पड़ेगी।

// routing class
foreach ($routes as $route) {
    if ($route != self::DEFAULT_ROUTE) {
        // do your normal routing logic
    } else {
        // check if file exists (as with code above), else send to error 404
    }
}

फिर कुछ के साथ कॉल करें:

$router->map('GET',Router::DEFAULT_ROUTE, 'legacyRouter.php', 'legacy');




routes