我正在看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.
如何以正确的方式映射所有路由?
您可以做些什么来减轻您的路由器文件是在YAML文件中移动路由定义.您的YAML仍然会有很多行,但它会更加易读.
不要忘记将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文件中的路由定义分开.例如,一个用于静态文件,一个用于管理区域,一个用于前端…
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],$route_name); } } // match current request $match = $router->match();
Danny Van Kooten也制作了PHP-Router
,它内置了对YAML文件的支持. (如果你看源代码,你会看到他使用Symfony解析器,所以这两种方法都非常相似)
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 PHPRouter\RouteCollection; use PHPRouter\Config; use PHPRouter\Router; use PHPRouter\Route; $config = Config::loadFromFile(__DIR__.'/router.yaml'); $router = Router::parseConfig($config); $router->matchCurrentRequest();