胎嘎侯
說到Controller(控制器),你會想到什麼?
如果第一個想到的是MVC的話,你是否曾經和我一樣困惑,應用邏輯在什麼情況下要放進Controller?什麼時候要歸到Model呢?
前面的疑問在「Laravel啟動與運行」這本書中有小小解惑:
控制器往往會將相似的路由組在一起,特別是在寫傳統的CRUD(增刪改查)時,控制器可能會處理所有可針對特定資源執行的動作,比較好的做法是將控制器當作交通警察,負責路由圍繞著應用程式的HTTP請求。控制器的主要工作是抓取HTTP的請求意圖,並將它傳遞給應用程式其餘的部分。
打開Laravel初始文件,觀察UserController.php中最上方的這一行程式碼
//從Laravel基本控制類擴展的UserController
class UserController extends Controller
在day06的文章中談到繼承時說道:
類可分為 基礎類別{ 衍生類別{} }
衍生類別可以直接訪問基礎類別中已存在的成員,實例化時會帶入基礎類別。繼承在物件導向中實現代碼重複利用,節省代碼工作;但同時也允許衍生類別進行擴展,增加在基礎類別中不存在的功能。串聯他們兩者之間關係用的是extends。
extends讓我們能便利使用Controller裡的基礎類,不過若UserController選擇不使用,將無法使用middleware
、validate
、dispatch
功能哦!
接著定義UserController操作的路由:
Route::get('user'/{id}' , 'UserController@show');
1.Request請求 ---> 路由URI(匹配)
2.UserController的show方法(執行)
3.傳遞參數{id} ---> show方法
定義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;
//指令
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
如果你想排除呈現HTML模板的路由,可以使用apiResource方法自動排除create和edit這兩個路由。
//指令
php artisan make:controller API/PhotoController --api
//路由註冊
Route::apiResource('photos', 'PhotoController');
//一次註冊數個資源控制器
Route::apiResources([
'photos' => 'PhotoController',
'posts' => 'PostController'
]);
一般情況下,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的統整就到這邊!明天見~