Я хотел бы иметь возможность переопределять маршруты, определенные в app / Http / routes.php, с помощью маршрута в пакете.
Например, в app / Http / routes.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 / routes.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']); } }