5

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の方法では、この優先度をルートごとに設定できるため、アプリの前にすべてのパッケージルートをロードするだけではありません。

4

1 に答える 1

8

でサービス プロバイダーの順序を変更することで、ルートが登録される順序を変更できるはずですconfig/app.php

現在、おそらく次のようになっています。

'providers' => [
    // ...
    'App\Providers\RouteServiceProvider',
    // ...
    'Vendor\Package\PackageServiceProvider',
],

次に、パッケージが最初にロードされるように順序を変更します。

'providers' => [
    // ...
    'Vendor\Package\PackageServiceProvider',  // register package routes first
    'App\Providers\RouteServiceProvider',
    // ...
],

register()特定のルートに優先順位を付けるには、サービス プロバイダーメソッドを (ab) 使用します。メソッドはあまり好きではありませんが、機能し、より良いものを見つけることができませんでした...

サービス プロバイダーが読み込まれる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']);
    }
}
于 2015-03-03T12:49:22.823 に答える