Я изучаю использование 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()
Зарегистрированные маршруты должны иметь приоритет перед автозагрузка s.
Я нашел способ сделать это на основе метода маршрутизации Opencart. У них есть 1145 различных общедоступных методов над 396 контроллерами, которые вызывается без явного указания метода контроллера &. Вот моя попытка.
.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/[email protected]');
$app->get('/home', 'common/[email protected]');
Правильно ли я думать, что это сделало бы приложение работало быстрее, так как не нужно будет искать все зарегистрированные маршруты для матча?
Есть ли лучший способ выполнить этот автоматический процесс маршрутизации?
То, что вы пытаетесь сделать, не позволит вашему приложению работать быстрее или медленнее, по какой-то причине люди сосредотачиваются на неправильных вещах, чтобы оптимизировать. Однако ваша идея полностью разрушает цель маршрутизации. Вы ** хотите ** определить маршрут, и вы ** хотите ** явно указать, что будет с ним обращаться. Если вы пытаетесь «автоматизировать» обработчики маршрутов, вы реализуете скрытую магию. В конечном итоге маршрут будет согласован с обработчиком (контроллером/функцией). Это просто бесконечно лучше, чтобы четко указать, что его обрабатывает. Вы ничего не получаете от этого типа автоматизации, кроме проблем. – Mjh