iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 17
1
Software Development

後端PHP+Laravel--新手實戰日記系列 第 17

Day17-Laravel新手基礎訓- The Basic Controller

胎嘎侯

說到Controller(控制器),你會想到什麼?

如果第一個想到的是MVC的話,你是否曾經和我一樣困惑,應用邏輯在什麼情況下要放進Controller?什麼時候要歸到Model呢?

Controller

前面的疑問在「Laravel啟動與運行」這本書中有小小解惑:

控制器往往會將相似的路由組在一起,特別是在寫傳統的CRUD(增刪改查)時,控制器可能會處理所有可針對特定資源執行的動作,比較好的做法是將控制器當作交通警察,負責路由圍繞著應用程式的HTTP請求。控制器的主要工作是抓取HTTP的請求意圖,並將它傳遞給應用程式其餘的部分。

基本控制器

打開Laravel初始文件,觀察UserController.php中最上方的這一行程式碼

    //從Laravel基本控制類擴展的UserController
    class UserController extends Controller

day06的文章中談到繼承時說道:

類可分為 基礎類別{ 衍生類別{} }
衍生類別可以直接訪問基礎類別中已存在的成員,實例化時會帶入基礎類別。繼承在物件導向中實現代碼重複利用,節省代碼工作;但同時也允許衍生類別進行擴展,增加在基礎類別中不存在的功能。串聯他們兩者之間關係用的是extends。

extends讓我們能便利使用Controller裡的基礎類,不過若UserController選擇不使用,將無法使用middlewarevalidatedispatch功能哦!

接著定義UserController操作的路由:

Route::get('user'/{id}' , 'UserController@show');

1.Request請求 ---> 路由URI(匹配)
2.UserController的show方法(執行)
3.傳遞參數{id} ---> show方法

Controllers & Namespaces

減輕負擔

定義Controller route時無須指定完整的Controller命名空間,因為RouteServiceProvider已經指定好前面一大串,只要寫App\Http\Controllers即可。

設文件夾

當出現一整列的Controllers看起來令人頭痛,我們可以新增一個文件夾來管理他們,假設我們今天要新增的是Photos文件夾,要注意的部分有:

    1.控制器路由的寫法,要在Controller前加上Photos
        Route::get('foo', 'Photos\AdminController@method');

    2.文件中namespace要加上Photos
        namespace App\Http\Controllers\Photos;
    

Resource Controllers

    //指令
    php artisan make:controller API/PhotoController --api
    
    //路由註冊
    Route::resource('photos', 'PhotoController');
    
    //一次註冊數個資源控制器
    Route::resources([
    'photos' => 'PhotoController',
    'posts' => 'PostController'
]);
    
    //Specifying The Resource Model指令
    php artisan make:controller PhotoController --resource --model=Photo

API Resource Routes

如果你想排除呈現HTML模板的路由,可以使用apiResource方法自動排除create和edit這兩個路由。

    //指令
    php artisan make:controller API/PhotoController --api
    
    //路由註冊
    Route::apiResource('photos', 'PhotoController');
    
    //一次註冊數個資源控制器
    Route::apiResources([
    'photos' => 'PhotoController',
    'posts' => 'PostController'
]);

Naming Resource Route Parameters

一般情況下,Route::resource將會新增一個基於資源名稱的單個路由參數,parameters方法可以改寫資源名稱admin+參數名稱user的形式=>admin_user

//parameters方法=>資源名稱+參數名稱
Route::resource('users', 'AdminUserController')->parameters([
    'users' => 'admin_user'
]);

//形成的URI
/users/{admin_user}

Laravel 也提供Localizing Resource URIs,尤其非英語系國家可以使用resourceVerbs建立本地化的動詞名稱。

use Illuminate\Support\Facades\Route;

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Route::resourceVerbs([
        'create' => 'crear', '英文'=>'西班牙文'
        'edit' => 'editar',
    ]);
}

Route :: resource路由也會有所變化,產生以下URI/fotos/crear代表成功。

今天Controller的統整就到這邊!明天見~


上一篇
Day16-Laravel新手基礎訓- The Basic Middleware
下一篇
Day18-Laravel新手基礎訓- The Basic Validation
系列文
後端PHP+Laravel--新手實戰日記30

尚未有邦友留言

立即登入留言