Laravel-Route 路由

Route 路由

路由負責管理網站所有的請求行為,根據訪問的網址以及請求動詞(GET.POST)來決定交由哪一個控制器的方法來處理

Laravel 5.3以前的版本

只有⼀個路由檔案,位於app/Http/routes.php

網⾴請求.API路由都寫在這裡

負責的檔案

一般使用者透過瀏覽器所進行的請求都會交由routes/web.php來設定 而API相關的請求則是交由routes/api.php來設定

編寫路由規則
Route::get('路徑','App\Http\Controllers\HomeController@index');

get 請求動詞

路徑 網址路徑

控制器 負責處理此請求的控制器,8.x之後需要加上命名空間

方法 負責處理此請求的方法

規則判定由上至下逐一比對,只要符合路徑就傳遞給控制器

8.X之後支援的新寫法

use App\Http\Controllers\HomeController;

Route::get(‘路徑’,[HomeController::class,‘index’]);

Route動詞

設定此規則所⽀援的請求⽅式

重要 較不重要
GET.POST PUT.PATCH.DELETE.OPTIONS. ANY.MATCH

聊聊Closure

PHP的匿名函式

//匿名函式可當成物件.指派給變數當成參數傳遞

Route::match(['get', 'post'], '/', function () {
 return 'Hello World';
});

直接在路由檔裡面耍流氓

你可以不經由控制器裡的方法來處理請求,直接在路由檔內搞定,但不建議這樣做

//routes/web.php
Route::get('路徑',function(){
    return 'Hello!';
});

關於Controllers控制器

位於app/Http/Controllers資料夾,可建立子資料夾

⽤於管理Model.View

建立檔案的指令

//app/Http/Controllers

php artisan make:controller HomeController

//建立⼀個不帶⽅法的Controller 

php artisan make:controller Controller名稱

//建立⼀個帶CRUD⽅法的Controller

php artisan make:controller Controller名稱- -resource

你不應該回傳Echo

內容不會直接回傳給前端,還是會經過回應堆疊和中介層等等


路由可傳遞參數
//routes/web.php

Route::get('路徑/{id}',function($id){
    return 'Hello ' . $id;
});
可傳遞多個參數
//routes/web.php

Route::get('路徑/{id}/{name}',function($id,$name){
    return 'Hello ' . $id . ',Name is ' . $name;
});

Route::get('posts/{post}/comments/{comment}', function ($post,
$comment) {
 //路徑分類⼀般都會有多個⽅法,都會加s,表⽰複數形
});
可傳可不傳遞參數
//routes/web.php
//=代表預設值

Route::get('路徑/{id?}',function($id = 1){
    return 'Hello ' . $id;
});

設定路由群組

//prefix路徑前置詞,將所包含的路由規則路徑加⼊前置詞

Route::group(['prefix' => 'demo'],function(){

    Route::get('hello', function () {
        return 'Hello' ;
    });
    
    Route::get('world', function () {
        return 'World';
    });
    
});

//namespace命名空間,將所包含的路由規則控制器類別加⼊命名空間

Route::namespace(‘App\Http\Controllers\Admin’)->group(function () {
 // 裡頭的控制器都包含在 以下命名空間”
 App\Http\Controllers\Admin"
});

設定路由名稱

//routes/web.php
Route::get('demo/{id}','App\Http\Controllers\HomeController@index')->name('home.index');

//resources/views/show.blade.php
<a href="{{ route(‘home.index’, [‘id’=>1]) }}">總覽頁</a>

Route Model Binding

只要在參數前宣告模型類別,⾃動為你⽤id進資料庫查詢該表,直接提供model物件給你

Route::get('api/users/{user}', function (App\User $user) {
 return $user->email;
});

進行轉址
外部轉址
//routes/web.php

Route::get(‘baha’,function(){
return redirect(‘[https://goblinlab.org](https://goblinlab.org/)’);
});
內部轉址
//routes/web.php

Route::get(‘redirect’,function(){
return redirect(url(‘hello’));
});

設定路由名稱

以後設定URL可以搭配route()直接使⽤Name

//routes/web.php

Route::get(‘users/{id}’,’App\Http\Controllers\UsersController@index')
->name(‘users.index’);
//resources/views/users.blade.php
<a href=“{{ route(‘users.index’, [‘id’=>1]) }} ”>

建立負責執⾏轉址的路由規則

直接建⽴⽤以轉址的路由規則

//路徑  網址  狀態碼

Route::redirect(‘here’ , ’http://goblinlab.org’ , 301);

redirect()的withInput()

⽤於當⽤⼾輸⼊錯誤需要轉回表單⾴,並保存輸⼊內容

Route::post('form',function(){
 return redirect('form')->withInput()
 ->with(['error' => true , 'message' => ‘Bad!’]);
});

old()

⽤於轉回⾴⾯要取得保留的輸⼊內容

<input name=“username” value=“<?=
old('username','default value') ?>”>

相關名詞說明
SPA Single Page Application

將網頁做成類似一般App應用樣貌的一頁式操作

Closure

沒有名稱的匿名函式,一般用於封包程式碼且只用一次

Facade

Laravel所提供的工具類別,包含大量好用的類別函式

Middleware

中介層,符合條件的請求在處理前會先執行的內容


我該先掌握哪些Route技巧? • 會撰寫基本路由語法 • ⾄少會GET.POST兩種動詞 • 會⽤路由傳遞參數 • 懂得怎麼轉址

參考資料

Laravel 學習筆記

使用 Route