Maison  >  Article  >  développement back-end  >  Comment fonctionne le routeur dans le framework php MVC (avec code)

Comment fonctionne le routeur dans le framework php MVC (avec code)

不言
不言original
2018-08-01 11:10:163470parcourir

Cet article vous propose un article sur le fonctionnement du routeur dans le framework php MVC (avec du code). Le contenu est très bon. Les amis dans le besoin peuvent s'y référer. J'espère que cela pourra aider tout le monde.

Remarque : Il semble y avoir un bug dans la catégorie traduction SF, cet article est donc donné dans la catégorie originale.

Le routeur ou répartiteur MVC détectera l'URL de la requête HTTP et tentera de faire correspondre un seul composant URL avec le contrôleur et la méthode définie dans le contrôleur, tout en transmettant tous les paramètres à la méthode.

Une classe de routeur simple est donnée ci-dessous pour illustrer grossièrement le fonctionnement d'un routeur. Cependant, dans un projet réel, le routeur est beaucoup plus complexe que l'exemple de routeur ci-dessous car il doit gérer plus de choses. La classe

<?php

class SimpleRouter
{
    // 路由数组,存储我们定义的路由
    private $routes;

    // 这个方法用于将定义的路由加入到 $routes 数组
    function add_route($route, callback $closure)
    {
        $this->routes[$route] = $closure;
    }

    // 执行特定的路由
    function execute()
    {
        $path = $_SERVER['PATH_INFO'];

        /**
        * 检测给定路由是否被定义,
        * 或者执行默认的 '/' 首页路由。
        */
        if (array_key_exists($path, $this->route)) {
            $this->route[$path]();
        } else {
            $this->route['/]();
        }
    }
}

SimpleRouter est un modèle simplifié d'un routeur MVC. Sa fonction principale est d'ajouter chaque route définie par l'utilisateur à un tableau et de l'exécuter. Pour comprendre son fonctionnement, copiez le code ci-dessous dans le fichier index.php.

<?php

// index.php

class SimpleRouter
{
    // 路由数组,存储我们定义的路由
    private $routes;

    // 这个方法用于将定义的路由加入到 $routes 数组
    function add_route($route, callback $closure)
    {
        $this->routes[$route] = $closure;
    }

    // 执行特定的路由
    function execute()
    {
        $path = $_SERVER['PATH_INFO'];

        /**
        * 检测给定路由是否被定义,
        * 或者执行默认的 '/' 首页路由。
        */
        if (array_key_exists($path, $this->route)) {
            $this->route[$path]();
        } else {
            $this->route['/]();
        }
    }
}

/* 创建 Router 实例 */
$router = new SimpleRouter();
 
/* 添加首页闭包值路由器 */
$router->add_route('/', function(){
    echo 'Hello World';
});
 
/* 添加另一个闭包路由 */
$router->add_route('/greetings', function(){
    echo 'Greetings, my fellow men.';
});
 
/* 添加可回调函数作为路由 */
$router->add_route('/callback', 'myFunction');
 
 
/* 回调函数处理程序 */
function myFunction(){
    echo "This is a callback function named '" .  __FUNCTION__ ."'";
}

/* 执行路由 */
$router->execute();

Allez maintenant dans votre navigateur et visitez les urls suivantes :

http://localhost/index.php/
http://localhost/index.php/greetings
http://localhost/index.php/callback

Pour chaque url vous devriez voir un message différent défini dans notre itinéraire. Alors comment fonctionne le routeur ?

Dans notre exemple, la méthode add_route ajoute le nom de chemin (route) de l'url au tableau de routes et définit l'opération de traitement correspondante. Cette opération de traitement peut être une simple fonction ou une fonction de rappel, transmise en guise de fermeture. Désormais, lorsque nous exécutons la méthode execute du routeur, elle détectera si une route correspond au tableau $routes actuel, et si c'est le cas, exécutera cette fonction ou cette fonction de rappel.

Si vous utilisez var_dump le tableau $routes, vous pouvez voir le contenu spécifique du tableau. Pour chaque itinéraire défini, une fermeture est stockée qui lui est associée.

array (size=3)
  '/' => 
    object(Closure)[2]
  '/greetings' => 
    object(Closure)[3]
  '/callback' => string 'myFunction' (length=10)

Le traitement de l'exécution est complété par les lignes suivantes. L'instruction $this->routes[$path]** renvoie une fermeture, qui est stockée dans le tableau **$routes et est utilisée pour spécifier l'exécution de la route. Notez le ().

$this->routes[$path]();
// 或
$this->routes['/']();
L'exemple ci-dessus montre simplement le fonctionnement du routeur. Par souci de simplicité, nous ne traitons aucune erreur et ne prenons pas en compte la sécurité du routage.

Recommandations associées :

Notes d'étude sur le routage du framework PHP MVC, notes d'étude sur le routage du framework MVC

Route du framework MVC d'apprentissage PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn