要减轻路由器文件的重量,您可以将路由定义移动到 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();