Laravel 工作坊
CRUD 綜合應用
shengyou @ 彰師大資工系學會 (2014.12.14)
階段任務
• 了解何謂 CRUD,並將 Controller 裡未完
成的 CRUD 動作完成
CRUD 簡介
什麼是 CRUD?
• CRUD = 一個 resource 的標準四動作
- Create 建立資料
- Read 讀取資料
- Update 更新資料
- Delete 刪除資料
Route 的 CRUD
• Route 與 Controller 之間 CRUD 對應到的
路徑及 Controller 的函式名稱
動詞 路徑 動作 名稱
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
現階段成果
• 目前已經完成的有:
• index 頁面
• create 頁面
• show 頁面
• edit 頁面
(P.S	
  都跟顯示有關,還沒有動作)
實作 CRUD
表單動作設定
• 將表單內的資料送到對應的 Controller 動
作裡
//	
  app/views/posts/create.blade.php
Form::open([‘route’	
  =>	
  ‘posts.store’,	
  ‘method’	
  =>	
  ‘POST’])
//	
  app/views/posts/edit.blade.php
Form::model($post,	
  [‘route’	
  =>	
  [‘posts.update’,	
  $post-­‐>id],	
  
‘method’	
  =>	
  ‘POST’])
★ 官方文件:http://laravel.tw/docs/4.2/html#form-model-binding
接收資料並處理
• 在 Controller 裡,先接收表單送過來的資
料,再送至 Model 處理
//	
  app/controllers/PostsController.php
public	
  function	
  store()
{
	
  	
  	
  	
  Post::create(Input::all());
	
  	
  	
  	
  return	
  Redirect::route(‘posts.index’)
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>with(‘success’,	
  ‘成功新增文章’);
}
★ 官方文件:http://laravel.tw/docs/4.2/requests#basic-input
頁面顯示 息
• 建立一個新的 notification 的 partial view,
可以讓我們顯示 息 (使用 bootstrap)
//	
  app/views/partials/notifications.blade.php
@if	
  ($message	
  =	
  Session::get('success'))
<div	
  class="alert	
  alert-­‐dismissable	
  alert-­‐success	
  backend-­‐
hud">
	
  	
  	
  	
  <button	
  type="button"	
  class="close"	
  data-­‐
dismiss="alert">×</button>
	
  	
  	
  	
  <strong>成功!</strong>	
  {{	
  $message	
  }}
</div>
@endif
★ 官方文件:http://laravel.tw/docs/4.2/validation#working-with-error-messages
資料驗證
• 從表單送過來的資料得先檢查是不是正確
無缺漏的?正確才能寫入資料庫
//	
  app/controllers/PostsController.php
$inputs	
  =	
  Input::all();
$validation	
  =	
  Validator::make($inputs,	
  Post::$rules);
if	
  ($validation-­‐>fails())
{
	
   return	
  Redirect::back()
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>withErrors($validation)-­‐>withInput();
}
Post::create($inputs);
★ 官方文件:http://laravel.tw/docs/4.2/validation#basic-usage
錯誤處理
• 找不到該筆資料時,可以怎麼處理?
/*	
  先檢查資料存不存在?不存在就回傳	
  404	
  */
//	
  app/controllers/PostsController.php
public	
  function	
  edit($id)
{
	
   $post	
  =	
  Post::find($id);
	
  
	
   if	
  (is_null($post))
	
   {
	
   	
   App::abort(404);
	
   }
	
  	
  	
  	
  /*	
  以下略...	
  */
錯誤處理
• 找不到該筆資料時,可以怎麼處理?
/*	
  Eloquent	
  有一個方法稱為	
  findOrFail	
  找不到時會自動	
  404	
  */
//	
  app/controllers/PostsController.php
public	
  function	
  update($id)
{
	
   $post	
  =	
  Post::findOrFail($id);
	
  	
  	
  	
  /*	
  以下略...	
  */
錯誤處理
• 找不到該筆資料時,可以怎麼處理?
/*	
  或是我們可以很優雅的跟使用者說找不到	
  */
//	
  app/controllers/PostsController.php
public	
  function	
  show($id)
{
	
   $post	
  =	
  Post::find($id);
	
  
	
   if	
  (is_null($post))
	
   {
	
   	
   return	
  Redirect::route('home.index')
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>with('error',	
  '找不到該文章');
	
   }
	
  	
  	
  	
  /*	
  以下略...	
  */
安全防禦
• 直接接受新增、更新資料的動作有危險,
增加驗證 csrf_token 提高安全性
//	
  app/controllers/PostsController.php
public	
  function	
  __construct()
{
	
   $this-­‐>beforeFilter('csrf',	
  ['on'	
  =>	
  'post']);
}
//	
  app/filters.php
Route::filter('csrf',	
  function()
{
	
   if	
  (Session::token()	
  !==	
  Input::get('_token'))
	
   {
	
   	
   throw	
  new	
  IlluminateSessionTokenMismatchException;
	
   }
});
★ 官方文件:http://laravel.tw/docs/4.2/html#csrf-protection
分頁
• Laravel 預設就支援分頁設定,只要在取出
資料時,把 get() 換成 paginate() 即可
• 在View 上使用 links(),Laravel 自動產生
bootstrap 分頁連結,URL 自動綁定
★ 官方文件:http://laravel.tw/docs/4.2/pagination
//	
  app/controllers/HomeController.php
$posts	
  =	
  Post::orderBy('created_at',	
  'desc')-­‐>paginate(5);
//	
  app/views/home/index.blade.php
<div	
  class="text-­‐center">
	
   {{	
  $posts-­‐>links()	
  }}
</div>
試試看
• 我們還有留言回覆的功能沒有完成,試著
用已經學會的 些技巧把 個功能完成
• 提示:
- 增加 Route 規則、Controller 案
- 修改View 上表單的 route,增加驗證機
制、錯誤處理…
想想看
• 我們沒有把文章分類顯示在文章詳細頁面
上,可以怎麼做?
• 目前刪除文章分類時,我們是直接把該分
章分類的資料庫紀錄刪除。但若該分類還
有對應到文章時,我們該怎麼處理?
階段檢查表
• 確認每一個 Controller 裡的動作都已完成
- 資料驗證、寫入、更新
- 錯誤處理
- 安全防護
- 分頁
問與答
學員可開始練習、實作
單元小結
• 在 個單元裡,我們學習如何將
Controller 內的 CRUD 完成
• 下一個單元,我們將學習 Laravel 的使用
者認證機制

CRUD 綜合應用