我正在考虑将 Lumen 或 Slim 用于项目,并想知道是否可以根据目录结构自动加载控制器,而不必注册所有路由。
这就是我希望自动加载工作的方式。
示例目录/类结构:
/app/Http/Controllers/
Foo/
BarController.php # App\Http\Controllers\Foo\BarController
如果路线是
example.com/foo/bar
==App\Http\Controllers\Foo\BarController::index()
example.com/foo/bar/add
== App\Http\Controllers\Foo\BarController::add()
注册的路由应该优先于自动加载的类。
我找到了一种基于 Opencart 路由方法的方法。他们有超过 396 个控制器的 1145 个不同的公共方法,这些方法都被调用而没有明确说明控制器和方法。这是我的尝试。
.htaccess
RewriteRule ^([^?]*) index.php?route=$1 [L,QSA]
应用程序/Http/routes.php
$route = array_shift($_GET);
$method_name = '';
$parts = explode('/', preg_replace('/[^a-zA-Z0-9_\/]/', '', (string)$route));
while ($parts) {
$class = '\App\Http\Controllers\\' . implode('\\', $parts);
if (class_exists($class)){
$app->match($route, $class . '@' . method_exists($class, $method_name) ? $method_name : 'index');
break;
} else {
$method_name = array_pop($parts);
}
}
如果需要的路由与 Opencart 的默认路由不同,则使用.htaccess RewriteRule
或 aresponse->redirect
路由到备用控制器。
我会使用他们的方法,但在
app/Http/routes.php
. 像这样
// route overrides
$app->get('/', 'common/home@index');
$app->get('/home', 'common/home@index');
我是否认为这会使应用程序运行得更快,因为它不必搜索所有已注册的路线以进行匹配?
有没有更好的方法来执行这个自动路由过程?