我正在研究使用Lumen或可能Slim的項目,並想知道是否有可能基於目錄結構自動加載控制器而不是必須註冊所有路由。如何使用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
或response->redirect
路由到一個替代控制器。
我會用他們的方法,但陳述我的路線覆蓋 app/Http/routes.php
。像這樣
// route overrides
$app->get('/', 'common/hom[email protected]');
$app->get('/home', 'common/[email protected]');
我是否正確的思維,這將讓應用程序運行得更快,因爲它不會有所有註冊的路線匹配搜索?
有沒有更好的方法來執行這個自動路由過程?
您試圖做的事情不會讓您的應用程序工作得更快或更慢,出於某種原因,人們爲了優化而專注於錯誤的事情。然而,你的想法完全破壞了路由的目的。您**希望**定義一條路線,而您**希望**明確說明將要處理的路線。如果你試圖「自動化」路由處理程序,那麼你正在實現隱藏的魔法。最終,路線將與處理程序(控制器/功能)匹配。明確說明它是如何處理它是非常好的。除了麻煩之外,這種類型的自動化沒有任何好處。 – Mjh