加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 使用路由器映射多个路由(控制器)

发布时间:2020-12-13 16:42:11 所属栏目:PHP教程 来源:网络整理
导读:我正在看danny vankooten路由器库 here.这看起来不错(虽然不知道如何处理项目从中到大,例如电子商务网站).现在,这个例子就是映射 $router-map('GET','/','home.php','home');$router-map('GET','/home/','home-home');$router-map('GET','/plans/','plans.ph
我正在看danny vankooten路由器库 here.这看起来不错(虽然不知道如何处理项目从中到大,例如电子商务网站).现在,这个例子就是映射
$router->map('GET','/','home.php','home');
$router->map('GET','/home/','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.

如何以正确的方式映射所有路由?

PS.给任何愿意回答如何使用通配符使用通配符的路由器匹配控制器/方法的人给予50的赏金.

您可以做些什么来减轻您的路由器文件是在YAML文件中移动路由定义.您的YAML仍然会有很多行,但它会更加易读.

在您的router.php文件中,使用以下代码:

不要忘记将symfony YAML解析器添加到composer.json中

use SymfonyComponentYamlYaml;
$yaml_file = 'routes.yaml';
$routes = Yaml::parse(file_get_contents($yaml_file));
foreach ($routes as $route_name => $params) {
    $router->map($params[0],$params[1],$params[2].'#'.$params[3],$route_name);
} 

// match current request
$match = $router->match();

您的文件routes.yaml将如下所示

index:      ["GET","/","home_controller","display_item"]
content:    ["GET","/content/[:parent]/?[:child]?","content_controller","display_item"]
article:    ["GET","/article/[:page]","article_controller","display_item"]

您可以做的另一件事可以获取较小的文件是将许多小型YAML文件中的路由定义分开.例如,一个用于静态文件,一个用于管理区域,一个用于前端…

要做这样的事情,你必须将router.php代码改成如下:

use SymfonyComponentYamlYaml;
$yaml_files = ['front.yaml','static.yaml','admin.yaml'];
foreach ($yaml_files as $yaml_file) {
    $routes = Yaml::parse(file_get_contents($yaml_file));
    foreach ($routes as $route_name => $params) {
        $router->map($params[0],$route_name);
    } 
}

// match current request
$match = $router->match();

Danny Van Kooten也制作了PHP-Router,它内置了对YAML文件的支持. (如果你看源代码,你会看到他使用Symfony解析器,所以这两种方法都非常相似)

From the doc

YAML路线定义

base_path: /blog

routes:
  index: [/index,someClass.indexAction,GET]
  contact: [/contact,someClass.contactAction,GET]
  about: [/about,someClass.aboutAction,GET]

Router.php

require __DIR__.'/vendor/autoload.php';

use PHPRouterRouteCollection;
use PHPRouterConfig;
use PHPRouterRouter;
use PHPRouterRoute;

$config = Config::loadFromFile(__DIR__.'/router.yaml');
$router = Router::parseConfig($config);
$router->matchCurrentRequest();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读