Могу ли я использовать промежуточное ПО Laravel 5, чтобы пакеты могли переопределять маршруты приложений?

Я хотел бы иметь возможность переопределить маршруты, определенные в 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 позволил бы установить этот приоритет для каждого маршрута, поэтому я не просто загружаю все маршруты пакетов перед приложением.

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']);
}
}
7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]