ホームページ >PHPフレームワーク >Laravel >Laravelルーティングファイルを非常に細かく分割する方法 (翻訳)

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

藏色散人
藏色散人転載
2020-04-09 11:44:503014ブラウズ

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

推奨チュートリアル: "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 までご連絡ください。