Я хотел бы иметь возможность переопределить маршруты, определенные в app / Http / rout.php, с маршрутом в пакете.
Например, в app / Http / rout.php у меня может быть это:
Route::get('/search/{type?}',['as' => 'search','uses' => 'SearchController@search']);
Я хочу иметь возможность определить это в /vendor/author/package/src/Http/routes.php:
Route::get('/search/properties', ['as' => 'properties','uses' => 'PropertyController@search']);
Файл app / Http / rout.php загружается первым, поэтому используется их маршрут, а не пакет.
В Laravel 4 я бы делал это, используя App :: before или App :: after, отдавая им приоритет.
Вот так в пакете маршрутов:
App::before(function() {
Route::get('/search/properties', ['as' => 'properties','uses' => 'PropertyController@search']);
});
Я не знаю, как этого добиться в Laravel 5. Я нашел это https://mattstauffer.co/blog/laravel-5.0-middleware-filter-style, но не знаю, как использовать это, чтобы делать то, что я хочу.
Изменить: способ сделать это в Laravel 4 позволил бы установить этот приоритет для каждого маршрута, поэтому я не просто загружаю все маршруты пакетов перед приложением.
Вы сможете изменить порядок регистрации маршрутов, изменив порядок поставщиков услуг в config/app.php
,
В настоящее время это выглядит примерно так:
'providers' => [
// ...
'App\Providers\RouteServiceProvider',
// ...
'Vendor\Package\PackageServiceProvider',
],
Теперь просто измените порядок, чтобы пакет был загружен первым:
'providers' => [
// ...
'Vendor\Package\PackageServiceProvider', // register package routes first
'App\Providers\RouteServiceProvider',
// ...
],
Чтобы просто расставить приоритеты для определенных маршрутов, вы можете (ab) использовать поставщиков услуг register()
метод. Мне не очень нравится метод, но он работает, и я не мог найти ничего лучше …
Когда поставщики услуг загружены register()
метод каждого провайдера называется. После этого (и в том же порядке) boot()
метод. Это означает, что независимо от порядка ваших провайдеров register()
метод в вашем пакете всегда будет вызываться до boot()
метод в RouteServiceProvider
, Это может выглядеть примерно так:
class PackageServiceProvider extends ServiceProvider {
public function boot(){
// register the regular package routes
}
public function register(){
// register route "overrides"// for example like this: (obviously you could also load a file)
app('router')->get('/search/properties', ['as' => 'properties','uses' => 'PropertyController@search']);
}
}
Других решений пока нет …