控制器
簡單的說,控制器本質(zhì)上是在一個(gè)位置將一個(gè)或多個(gè)路由有邏輯組織在一塊的類??刂破魍鶗?huì)將類似的路由組合在一起,特別是如果應(yīng)用程序是按照傳統(tǒng)CRUD格式構(gòu)造的,在這種情況下,控制器可以處理那些可對特定資源執(zhí)行的所有操作
控制器的主要任務(wù)是捕獲HTTP請求,并將這些請求傳遞給應(yīng)用程序的剩余部分
-
生成控制器
php artisan make:controller cname接下來就會(huì)在app/Http/Controllers中創(chuàng)建一個(gè)名為cname.php的新文件
-
控制器的命名空間
為控制器創(chuàng)建一個(gè)路由
Route::get('/', 'cname@fun');在上面這個(gè)路由中我引用了一個(gè)具有完全限定類名的控制器APP\Http\Controllers\cname但是只使用了類名cname,這是因?yàn)椋谀J(rèn)情況下,Laravel被設(shè)置為在該命名空間中尋找控制器
-
通用控制器方法示例
-
返回視圖
public function index() { return view('fun')->with('variable', Task::all()); }該控制器方法會(huì)加載resouces/views/fun.php視圖,并將其通過一個(gè)名為variable的變量進(jìn)行傳遞,其中包含Task::all()Eloquent方法的結(jié)果
-
獲取用戶輸入
此方法的作用是從用戶哪里獲取輸入內(nèi)容并對其進(jìn)行操作
-
首先,快速實(shí)現(xiàn)綁定
//綁定基本的表單操作 //route/web.php Route::get('tasks/create', 'Taskscontroller@create'); Route::post('tasks', 'Taskscontroller@store');綁定tasks/create的GET操作(顯示表單)和tasks/的POST操作(創(chuàng)建一個(gè)新的任務(wù)并進(jìn)行POST操作時(shí)提交到tasks/)。假設(shè)控制器中的create()方法只顯示一個(gè)表單,store()方法的使用如下所示
//常見的表單輸入控制器方法 //Taskscontroller.php public function store() { $task = new Task; $task->title = Input::get('discription'); $task->save(); return redirect('tasks'); }該示例使用了Eloquent模型和redirect()函數(shù),創(chuàng)建了一個(gè)新的Task,從用戶輸入中提取數(shù)據(jù)并進(jìn)行保存,然后重定向到顯示所有任務(wù)(task)的頁面。
從POST中獲取用戶輸入有兩種主要方式:這里使用了Input facade及請求對象(request object)
-
-
將依賴注入控制器
Laravel的facade代表Laravel代碼庫中最有用的類的簡單界面,可以獲取當(dāng)前相關(guān)請求,用戶輸入,會(huì)話和緩存等信息,所有的控制器方法都是由Laravel的容器進(jìn)行解析的,這意味著所有的指定容器都知道如何解析的信息都將被自動(dòng)注入
如果希望擁有一個(gè)Request對象的實(shí)例而不是用facade實(shí)現(xiàn),只需要在方法參數(shù)中指定Illuminate\Http\Request就行,如下示例
public function store(\Illuminate\Http\Request $request) { $task = new Task; $task->title = $request->input('title'); $task->description = $request->input('description'); $task->save(); return redirect('tasks'); }
-
-
資源控制器
-
Laravel對傳統(tǒng)REST/CRUD控制器的所有路由都有一些約定
HTTP動(dòng)詞 URL 控制器方法名稱 具體名字 描述 GET tasks index() tasks.index 顯示所有任務(wù) GET tasks/create create() tasks.create 顯示創(chuàng)建任務(wù)表單 POST tasks store() tasks.store 從創(chuàng)建任務(wù)表單中接受表單提交 GET tasks/{task} show() tasks.show 顯示一個(gè)任務(wù) GET tasks/{task}/edit edit() tasks.edit 編輯一個(gè)任務(wù) PUT/PATCH tasks/{task} update() Tasks.update 從編輯任務(wù)表單中接受表單提交 DELETE tasks/{task} destroy() tasks.destroy 刪除一個(gè)任務(wù) -
綁定資源控制器
-
以上是在Laravel中使用的傳統(tǒng)路由名稱,但我們不必為每一個(gè)控制器方法生成路由,而可以使用一種叫“資源控制器綁定”的方法
//routes/web.php Route::resource('tasks', 'TasksController');這樣就可以自動(dòng)將該資源上的所有路由綁定到指定控制器的相應(yīng)方法上,他也會(huì)適當(dāng)?shù)孛@些路由,例如,tasks資源控制器上的index()方法將被命名為tasks.index
-
-