CRUD 綜合應用
-
Upload
shengyou-fan -
Category
Technology
-
view
5.040 -
download
0
Transcript of CRUD 綜合應用
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
表單動作設定• 將表單內的資料送到對應的 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,增加驗證機制、錯誤處理…