Php 如何使用Lumen或Slim框架实现默认路由行为
我正在考虑在一个项目中使用Lumen或Slim,想知道是否有可能基于目录结构自动加载控制器,而不必注册所有路由 这就是我希望自动加载工作的方式 目录/类结构示例:Php 如何使用Lumen或Slim框架实现默认路由行为,php,url-routing,slim,lumen,psr-4,Php,Url Routing,Slim,Lumen,Psr 4,我正在考虑在一个项目中使用Lumen或Slim,想知道是否有可能基于目录结构自动加载控制器,而不必注册所有路由 这就是我希望自动加载工作的方式 目录/类结构示例: /app/Http/Controllers/ Foo/ BarController.php # App\Http\Controllers\Foo\BarController 如果路线是 example.com/foo/bar==App\Http\Controllers\foo\BarContr
/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\bar控制器::add()
注册的路由应该优先于自动加载的类
我已经找到了一种基于Opencart的路由方法来实现这一点的方法。
它们在396个控制器上有1145个不同的公共方法,这些方法都是在没有明确说明控制器和方法的情况下调用的。
这是我的尝试
.htaccess
RewriteRule^([^?]*)index.php?路由=$1[L,QSA]
app/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
或响应->重定向
路由到备用控制器
我希望使用他们的方法,但在
app/Http/routes.php
。像这样
// route overrides
$app->get('/', 'common/home@index');
$app->get('/home', 'common/home@index');
我认为这会使应用程序运行得更快,因为它不必搜索所有注册的路由来查找匹配项,对吗
是否有更好的方法执行此自动路由过程 我认为,您可以结合Slim 3和对的支持来完成这项工作 基本战略如下:
glob
或自动加载器)李>
ReflectionMethod::IS_PUBLIC
过滤器调用ReflectionClass::getMethods
,以便只获取该类的公共方法李>
ReflectionClass::getName
获取类名,并使用ReflectionClass::getNamespaceName
获取命名空间(如有必要)李>
$app->get($route\u signature,“$class\u name:$method\u name”)
- 反射非常慢,因此您可能希望更多地将其作为构建步骤来实现,缓存生成的路由,而不是在每次请求时动态地重新生成路由
- 您可能需要一些额外的命名约定来区分HTTP谓词。例如,将与
路由相对应的所有方法名称以GET
开头。所以您可能有GET
,\Foo\BarController::getAdd
,等等\Foo\BarController::postAdd
- 构造参数化路由(
)将需要更多的工作,因为您可能需要使用/bar/add/{id}
提取相应的方法参数。同样,您需要决定如何基于这些参数构造路由的一些约定ReflectionFunctionBStract::getParameters