gpt4 book ai didi

php - 使用路由器映射多个路由( Controller )

转载 作者:可可西里 更新时间:2023-10-31 22:44:51 25 4
gpt4 key购买 nike

我正在查看 danny vankooten 路由器库 here .这看起来不错(虽然不确定它将如何处理从中型到大型的项目,例如电子商务网站)。现在,以映射为例

$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 个 Controller ,每个 Controller 有 2-3 个操作/方法。

我如何映射它们。如果我使用上述映射方法,我可能最终会有超过 100 行映射,这看起来不对。

我相信应该有一种方法或捷径/通配符,比如检查是否有可用的页面或 Controller ,然后加载它或抛出 404。

如何以正确的方式绘制所有路线?

附言。向愿意回答如何使用通配符匹配 Controller /方法的上述路由器的任何人悬赏 50。

最佳答案

减轻路由文件的方法是将路由定义移动到 YAML 文件中。您的 YAML 中仍然会有很多行,但它会更具可读性。

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

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

use Symfony\Component\Yaml\Yaml;
$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 Symfony\Component\Yaml\Yaml;
$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],$params[1], $params[2].'#'.$params[3], $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]

路由器.php

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

use PHPRouter\RouteCollection;
use PHPRouter\Config;
use PHPRouter\Router;
use PHPRouter\Route;

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

关于php - 使用路由器映射多个路由( Controller ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41822704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com