1. 程式人生 > >Laravel 5.5 Route

Laravel 5.5 Route

Route(路由)

冪等性:指一次和多次請求某一個資源應該具有同樣的副作用,也就是一次訪問與多次訪問,對這個資源帶來的變化是相同的。
        路由動作

動詞 描述 是否冪等
GET 獲取資源,單個或多個
POST 建立資源
PUT 更新資源,客戶端提供完整的資源資料
PATCH 更新資源,客戶端提供部分的資源資料
DELETE 刪除資源

         注)為什麼 PUT 是冪等的而 PATCH 是非冪等的,因為 PUT 是根據客戶端提供了完整的資源資料,客戶端提交什麼就替換為什麼,而 PATCH 有可能是根據客戶端提供的引數,動態的計算出某個值,例如每次請求後資源的某個引數減1,所以多次呼叫,資源會有不同的變化。

// 支援的請求方式
	Route::get($uri, $callback);
	Route::post($uri, $callback);
	Route::put($uri, $callback);
	Route::patch($uri, $callback);
	Route::delete($uri, $callback);
	Route::options($uri, $callback);
	    eg:
	        資源路由
            	Route::resource('users', 'UsersController');
            	等同於
                    Route::get('/users', '
[email protected]
')->name('users.index'); Route::get('/users/create', '[email protected]')->name('users.create'); Route::get('/users/{user}', '[email protected]')->name('users.show'); Route::post('/users', '[email protected]
')->name('users.store'); Route::get('/users/{user}/edit', '[email protected]')->name('users.edit'); Route::patch('/users/{user}', '[email protected]')->name('users.update'); Route::delete('/users/{user}', '[email protected]')->name('users.destroy');
// 閉包路由
    Route::get('hello', function () {
        return 'Hello, Welcome to LaravelAcademy.org';
    });
// 指定路由控制器和方法
    Route::get('/user', '[email protected]');
// 相應多種http請求
    Route::match(['get', 'post'], 'foo', function () {
        return 'This is a request from get or post';
    });

    Route::any('bar', function () {
        return 'This is a request from any HTTP verb';
    });
// 路由重定向
    Route::redirect('/here', '/there', 301); // 在路由定義檔案中直接將路由重定向到另一個路由中
// 路由檢視, 路由直接指向試圖檔案
    Route::view('/welcome', 'welcome');
    Route::view('/welcome', 'welcome', ['name' => '學院君']);
// 資源路由
    Route::resource('posts', 'PostController');
        
        (部分資源路由)
            Route::resource('post', 'PostController', ['only' =>
                ['index', 'show']
            ]);

            Route::resource('post', 'PostController', ['except' =>
                ['create', 'store', 'update', 'destroy']
            ]);
        
        (API資源路由)
           宣告被 API 消費的資源路由時,你可能需要排除展示 HTML 模板的路由,如 create 和 edit,為了方便起見,Laravel 提供了 apiResource 方法自動排除這兩個路由:
           Route::apiResource('post', 'PostController');
        
        (命名資源路由)
            預設情況下,所有資源控制器動作都有一個路由名稱,不過,我們可以通過傳入 names 陣列來覆蓋這些預設的名稱:
            Route::resource('post', 'PostController', ['names' =>
                ['create' => 'post.build']
            ]);
        
        (命名資源路由引數)
            預設情況下,Route::resource 將會基於資源名稱的單數格式為資源路由建立路由引數,你可以通過在選項陣列中傳遞 parameters 來覆蓋這一預設設定。 parameters 是資源名稱和引數名稱的關聯陣列:
            Route::resource('user', 'AdminUserController', ['parameters' => [
                'user' => 'admin_user'
            ]]);
        
        (補充資源控制器)
            如果需要在預設資源路由之外新增額外的路由到資源控制器,應該在呼叫 Route::resource 之前定義這些路由,否則,通過 resource 方法定義的路由可能無意中覆蓋掉補充的額外路由:
            Route::get('posts/popular', '[email protected]');
            Route::resource('posts', 'PostController');
// 路由引數
    (必選引數)
            Route::get('user/{id}', function ($id) {
                return 'User ' . $id;
            });

            Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
                return $postId . '-' . $commentId;
            });
        
    (可選引數)
            Route::get('user/{name?}', function ($name = null) {
                return $name;
            });
   
            Route::get('user/{name?}', function ($name = 'John') {
                return $name;
            });
      
    (正則約束)
            Route::get('user/{name}', function ($name) {
                // name 必須是字母且不能為空
            })->where('name', '[A-Za-z]+');

            Route::get('user/{id}', function ($id) {
                // id 必須是數字
            })->where('id', '[0-9]+');
            
            Route::get('user/{id}/{name}', function ($id, $name) {
                // 同時指定 id 和 name 的資料格式
            })->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
            
    (全域性約束)
                如果想要路由引數在全域性範圍內被給定正則表示式約束,可以使用 pattern 方法。需要在 RouteServiceProvider 類的 boot 方法中定義這種約束模式:
                /**
                 * 定義路由模型繫結,模式過濾器等
                 *
                 * @param  \Illuminate\Routing\Router  $router
                 * @return void
                 * @translator  http://laravelacademy.org
                 */
                public function boot()
                {
                    Route::pattern('id', '[0-9]+');
                    parent::boot();
                }

// 命名路由
    Route::get('user/profile', function () {
        // 通過路由名稱生成 URL
        return 'my url: ' . route('profile');
    })->name('profile');

    Route::get('user/profile', '[email protected]')->name('profile');
        * 為命名路由生成 URL
            $url = route('profile');
            $url = route('profile', ['id' => $id]);

        * 檢查當前路由
            如果你想要判斷當前請求是否被路由到給定命名路由,可以使用 Route 例項上的 named 方法,例如,你可以從路由中介軟體中檢查當前路由名稱:
            if ($request->route()->named('profile')) {
                //
            }
// 路由分組
        
    (中介軟體)
        Route::middleware(['first', 'second'])->group(function () {
            Route::get('/', function () {
                // Uses first & second Middleware
            });

            Route::get('user/profile', function () {
                // Uses first & second Middleware
            });
        });

        Route::get('/', function () {
            //
        })->middleware('token');

        Route::get('/', function () {
            //
        })->middleware('token', 'auth');
        
    (名稱空間)
        Route::namespace('Admin')->group(function () {
            // Controllers Within The "App\Http\Controllers\Admin" Namespace
        });
        
    (子域名路由)
        Route::domain('{account}.blog.dev')->group(function () {
            Route::get('user/{id}', function ($account, $id) {
                return 'This is ' . $account . ' page of User ' . $id;
            });
        });
        
    (路由字首)
        Route::prefix('admin')->group(function () {
            Route::get('users', function () {
                // Matches The "/admin/users" URL
            });
        });

// 路由模型繫結
        
    (隱式繫結)
        Laravel 會自動解析定義在路由或控制器動作(變數名匹配路由片段)中的 Eloquent 模型型別宣告,例如(我們將這個路由定義在 routes/api.php 檔案中):
        Route::get('users/{user}', function (App\User $user) {
            dd($user);
        });
            * 自定義鍵名
            如果你想要在隱式模型繫結中使用資料表的其它欄位而不是 id 欄位,可以重寫 Eloquent 模型類的 getRouteKeyName 方法,以 User 模型為例,可以在該模型類中新增這個方法 :
            /**
             * Get the route key for the model.
             *
             * @return string
             */
            public function getRouteKeyName()
            {
                return 'name';
            }
            http://blog.dev/api/users/username 訪問就可以獲取注入的使用者模型
       
     (顯式繫結)
        有隱式繫結,就有顯式繫結。要註冊顯式繫結,可以使用路由器的 model 方法來為給定引數指定繫結類。你需要在 RouteServiceProvider 類的 boot 方法中定義顯式模型繫結:
        public function boot()
        {
            parent::boot();
            Route::model('user_model', App\User::class);
        }
        // 路由eg
        $router->get('profile/{user_model}', function(App\User $user) {
             dd($user);
        });
            * 自定義解析邏輯
            如果你想要使用自定義的解析邏輯,可以在 RouteServiceProvider 類的 boot 方法中使用 Route::bind 方法,傳遞到 bind 方法的閉包會獲取到 URI 請求引數中的值,並且返回你想要在該路由中注入的類例項:
            public function boot()
            {
                parent::boot();

                Route::bind('user', function($value) {
                    return App\User::where('name', $value)->first();
                });
            }


    // 訪問當前路由
    $route = Route::current();  // 獲取當前路由例項
    $name = Route::currentRouteName();  // 獲取當前路由名稱
    $action = Route::currentRouteAction();  // 獲取當前路由action屬性