CRUD 綜合應用

21
Laravel 工作坊 CRUD 綜合應用 shengyou @ 彰師大資工系學會 (2014.12.14)

Transcript of CRUD 綜合應用

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.phpForm::open([‘route’  =>  ‘posts.store’,  ‘method’  =>  ‘POST’])

//  app/views/posts/edit.blade.phpForm::model($post,  [‘route’  =>  [‘posts.update’,  $post-­‐>id],  ‘method’  =>  ‘POST’])

★ 官方文件:http://laravel.tw/docs/4.2/html#form-model-binding

接收資料並處理• 在 Controller 裡,先接收表單送過來的資料,再送至 Model 處理//  app/controllers/PostsController.phppublic  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.phppublic  function  edit($id){   $post  =  Post::find($id);     if  (is_null($post))   {     App::abort(404);   }

       /*  以下略...  */

錯誤處理• 找不到該筆資料時,可以怎麼處理?

/*  Eloquent  有一個方法稱為  findOrFail  找不到時會自動  404  *///  app/controllers/PostsController.phppublic  function  update($id){   $post  =  Post::findOrFail($id);

       /*  以下略...  */

錯誤處理• 找不到該筆資料時,可以怎麼處理?

/*  或是我們可以很優雅的跟使用者說找不到  *///  app/controllers/PostsController.phppublic  function  show($id){   $post  =  Post::find($id);     if  (is_null($post))   {     return  Redirect::route('home.index')                                              -­‐>with('error',  '找不到該文章');   }

       /*  以下略...  */

安全防禦• 直接接受新增、更新資料的動作有危險,增加驗證 csrf_token 提高安全性//  app/controllers/PostsController.phppublic  function  __construct(){   $this-­‐>beforeFilter('csrf',  ['on'  =>  'post']);}

//  app/filters.phpRoute::filter('csrf',  function(){   if  (Session::token()  !==  Input::get('_token'))   {     throw  new  Illuminate\Session\TokenMismatchException;   }});

★ 官方文件: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 的使用者認證機制