Laravelルーティングファイルを非常に細かく分割する方法 (翻訳)

藏色散人
リリース: 2020-04-09 11:44:50
転載
2975 人が閲覧しました

おそらく、非常に大きなファイルにルートが詰め込まれているという状況に誰もが遭遇したことがあると思います。嘘をつくつもりはありませんが、これは私を長い間気が狂いそうにしていたので、それを修正する方法を見つけなければなりませんでした。これが最終的にルーティングファイルを構築する方法です。

推奨チュートリアル: "laravel チュートリアル"

最初は、ルート グループ メソッドを使用してファイルを受信することを考えていました。これは、laravel が RouteServiceProvider でルートを分割する方法です。

<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator&#39;s root namespace.
     *
     * @var string
     */
    protected $namespace = &#39;App\Http\Controllers&#39;;
    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        //
        parent::boot();
    }
    /**
     * Define the routes for the application.
     *
     * @return void
     */
    public function map()
    {
        $this->mapApiRoutes();
        $this->mapWebRoutes();
        //
    }
    /**
     * Define the "web" routes for the application.
     *
     * These routes all receive session state, CSRF protection, etc.
     *
     * @return void
     */
    protected function mapWebRoutes()
    {
        Route::middleware(&#39;web&#39;)
             ->namespace($this->namespace)
             ->group(base_path(&#39;routes/web.php&#39;));
    }
    /**
     * Define the "api" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapApiRoutes()
    {
        Route::prefix(&#39;api&#39;)
             ->middleware(&#39;api&#39;)
             ->namespace($this->namespace)
             ->group(base_path(&#39;routes/api.php&#39;));
    }
}
ログイン後にコピー

ユーザー関連のルートを users.php というファイルに抽象化し、mapApiRoutes を mapUsersRoutes としてコピーして、users.php ファイルを指定しました。

 /**
     * Define the routes for the application.
     *
     * @return void
     */
    public function map()
    {
        $this->mapApiRoutes();
        $this->mapWebRoutes();
        $this->mapUsersRoutes();
        //
    }
/**
     * Define the "api" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapUsersRoutes()
    {
        Route::prefix(&#39;api&#39;)
             ->middleware(&#39;api&#39;)
             ->namespace($this->namespace)
             ->group(base_path(&#39;routes/users.php&#39;));
    }
ログイン後にコピー

あなたが何を考えているかはわかりますが、新しいファイルを作成する必要があるたびに、以前と同じように登録する必要があるため、これは明らかに最善の解決策ではありません。そこで、この最初のアイデアを改良する必要がありました。

私は、アプリケーション全体のパブリック部分を個別のルーティング ファイルに分割するというアイデアを持っていました。また、どのルートも認証済みルート、ゲスト ルート、パブリック ルートを超えることはできないという考えがありました。

ルーティング フォルダーの構造を次のように最適化しました:

├── routes   
│   ├── api    
│   │   ├── public
│   |   │   ├── users.php 
│   │   ├── auth
│   |   │   ├── users.php 
│   │   ├── guest
│   |   │   ├── users.php
ログイン後にコピー

一見すると、「あまり変わりません。これらのファイルをマップする必要があります」と思われるかもしれません。 」。ただし、実際にはphpによってネイティブに提供されるglobと呼ばれる関数を利用できます。これは、laravelのソリューションに結合されていないため、すぐに使えるソリューションです。

glob は正規表現を受け入れ、正規表現に一致するパスでファイル名を検索できます。したがって、ルートは特定のフォルダーの下に編成されており、これらのフォルダーの下にあるすべてのファイルを検索して、それらをミドルウェアに登録できるようになりました。

<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator&#39;s root namespace.
     *
     * @var string
     */
    protected $namespace = &#39;App\Http\Controllers&#39;;
    /**
     * Define the routes for the application.
     *
     * @return void
     */
    public function map()
    {
        $this->mapAuthRoutes();
        $this->mapGuestRoutes();
        $this->mapPublicRoutes();
//        $this->mapWebRoutes();
        //
    }
    /**
     * Define the "web" routes for the application.
     *
     * These routes all receive session state, CSRF protection, etc.
     *
     * @return void
     */
    protected function mapWebRoutes()
    {
        Route::middleware(&#39;web&#39;)
            ->namespace($this->namespace)
            ->group(base_path(&#39;routes/web.php&#39;));
    }
    /**
     * Define the "api" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapAuthRoutes()
    {
        foreach (glob(base_path(&#39;routes/api/auth/*.php&#39;)) as $file) {
            Route::prefix(&#39;api&#39;)
                ->middleware([&#39;api&#39;, &#39;auth:api&#39;])
                ->group($file);
        }
    }
    protected function mapGuestRoutes()
    {
        foreach (glob(base_path(&#39;routes/api/guest/*.php&#39;)) as $file) {
            Route::prefix(&#39;api&#39;)
                ->middleware([&#39;api&#39;, &#39;guest:api&#39;])
                ->group($file);
        }
    }
    protected function mapPublicRoutes()
    {
        foreach (glob(base_path(&#39;routes/api/public/*.php&#39;)) as $file) {
            Route::prefix(&#39;api&#39;)
                ->middleware(&#39;api&#39;)
                ->group($file);
        }
    }
}
ログイン後にコピー

これで、新しいファイルを作成するたびに、foreach は正規表現一致を使用しているため、そのファイルを見つけます (ファイルは対応するパスにあり、PHP 拡張子を持つため、通常の一致と一致します)。すごくセクシーですね!でも、ちょっと待ってください。

これらのファイルはどのように登録されるのでしょうか?

laravelのライフサイクルを勉強したことがある方は、サービスプロバイダーがlaravelリクエストのライフサイクルの一部であり、この機能を使用してルートを動的に登録できることをご存知でしょう。 ######それでおしまい!気に入ってくれるといいな。

元のアドレス: https://dev.to/secmohammed/how-to-separa...

翻訳アドレス: https://learnku.com/laravel/t /42989

以上がLaravelルーティングファイルを非常に細かく分割する方法 (翻訳)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート