Upload
shengyou-fan
View
5.815
Download
0
Embed Size (px)
Citation preview
Laravel 工作坊連結 Controller
shengyou @ 彰師大資工系學會 (2014.12.13)
階段任務• 把原本直接寫在 routes.php 裡的控制邏輯,搬到對應的 Controller 內
Controller 介紹
為什麼用 Controller?• 截至目前我們把所有應用程式邏輯都寫在
routes.php,雖然可以正常運作,但會讓
routes.php 一直長、一直長… 這樣寫下去程式遲早難以維護
• 所有程式邏輯沒有清楚的分類,若是其他人接手時,也很難找出運行脈絡
什麼是 Controller?• 依照 MVC 原理,Route 處理 Request 並依應用程式邏輯分配給 Controller處理,由
Controller 操作 Models 及回傳 Views
• 將應用程式的裡將複雜的程式操作邏輯,獨立成 Class 以利維護,從 Class、Function 的命名就可以大致猜出其功能
artisan controller:make• 產生 Controller 檔案
- 呼叫這個指令,artisan 會依提供的名稱產生 Controller 檔案並放置到 app/
controllers 底下
- 命名慣例 {‘M’odel複數}Controller
• 範例:$ php artisan controller:make PostsController
artisan generate:controller
• generator 版的產生指令
- 產生出來的檔案結果和官方版的一樣,只差在註解稍有不同
• 範例:$ php artisan generate:controller PostsController
Controller 結構• 產生出來的 Controller 依 RESTful 概念可區分出以下動作
動詞 路徑 動作 名稱
GET /resource index resource.index
GET /resource/create create resource.create
POST /resource store resource.store
GET /resource/{id} show resource.show
GET /resource/{id}/edit edit resource.edit
PUT/PATCH /resource/{id} update resource.update
DELETE /resource/{id} destroy resource.destroy
★ 參考:http://laravel.tw/docs/4.2/controllers#restful-resource-controllers
設定 Route• 將動作轉給 Controller
Route::get(‘posts’, ‘PostsController@index’);Route::get(‘posts/create’, ‘PostsController@create’);Route::post(‘posts’, ‘PostsController@store’);Route::get(‘posts/{id}’, ‘PostsController@show’);Route::get(‘posts/{id}/edit’, ‘PostsController@edit’);Route::patch(‘posts/{id}’, ‘PostsController@update’);Route::delete(‘posts/{id}’, ‘PostsController@destroy’);
幫 Route 命名• 可以為每一個 Route 取一個名字,方便在
view 裡使用 route() helper 設定連結,Laravel 也會檢查 route 是否存在?
• 命名慣例:resources.verb// routes.phpRoute::get(‘posts/{id}’, [‘as’ => ‘posts.show’, ‘uses’ => ‘PostsController@show’]);
// app/views/home/index.blade.php<a href=”{{ route(‘posts.show’, $id) }}”>Read more</a>
把邏輯搬離 Route• 把原本寫在 routes.php 裡的程式碼搬到對應的 Controller 裡的對應動作
• 修改 Views 裡原本的 url() 寫法,改成
route() 的寫法
// app/controllers/PostsController.phppublic function show($id){ return View::make(‘posts.show’);}
整合 Model 送資料• 在 Controller 裡把該頁要顯示的資料用
Model 查詢出來,並送到 Views 裡// app/controllers/PostsController.phppublic function show($id){ $post = Post::find($id);
$data = compact(‘post’); return View::make(‘posts.show’, $data);}
在 Views 裡顯示資料• 當 Controller 把資料準備好送到 Views
後,在 Views 裡就可以直接取用該物件來顯示資料// app/views/home/index.blade.php@foreach($posts as $post) <h1>{{{ $post-‐>title }}}</h1> <p>{{{ $post-‐>content }}}</p>@endforeach
存檔點• 試著把現在已經可以運作的程式碼加入版本控制內
• 流程提醒:
- working directory > staging area > commit
階段檢查表• 確認每一個頁面內都可以正確顯示,且資料內容都是依照資料庫查詢的結果排序
• 在頁面點選任一連結後,頁面顯示的內容也都是正確無誤的
問與答學員可開始練習、實作
單元小結• 在這個單元裡,我們學習如何把應用程式的控制邏輯從 Route 搬至 Controller,並在 Controller 裡查詢資料後,送至 View 裡顯示
• 下一個單元,我們將綜合應用所學,完成應用程式的所有 CRUD 動作