SlideShare a Scribd company logo
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 的使用
者認證機制

More Related Content

PDF
View 與 Blade 樣板引擎
PDF
使用 Controller
PDF
Route路由控制
PDF
開發環境建置
PDF
使用者認證
PDF
工作坊總結
PDF
開發環境建置
PDF
Migrations 與 Schema操作
View 與 Blade 樣板引擎
使用 Controller
Route路由控制
開發環境建置
使用者認證
工作坊總結
開發環境建置
Migrations 與 Schema操作

What's hot (20)

PDF
CRUD 綜合運用
PDF
Package 安裝與使用
PDF
Route 機制
PDF
CRUD 綜合運用
PDF
Model & Seeding整合
PDF
Schema & Migration操作
PDF
View 與 Blade 樣板引擎
PDF
應用程式佈署
PDF
Route 路由控制
PDF
使用 laravel 的前與後
PDF
Model 設定與 Seeding
PDF
開發流程與工具介紹
PDF
View 與 Blade 樣板引擎
PDF
整合 Open ID
PDF
使用 Controller
PDF
驗證與訊息
PDF
Model 設定與 Seeding
PDF
開發環境建置
PDF
Migrations 與 Schema 操作
PDF
給你一個使用 Laravel 的理由
CRUD 綜合運用
Package 安裝與使用
Route 機制
CRUD 綜合運用
Model & Seeding整合
Schema & Migration操作
View 與 Blade 樣板引擎
應用程式佈署
Route 路由控制
使用 laravel 的前與後
Model 設定與 Seeding
開發流程與工具介紹
View 與 Blade 樣板引擎
整合 Open ID
使用 Controller
驗證與訊息
Model 設定與 Seeding
開發環境建置
Migrations 與 Schema 操作
給你一個使用 Laravel 的理由
Ad

Viewers also liked (9)

PDF
課程簡介
PDF
專案啟動與設定
PDF
使用 Eloquent ORM
PDF
PHP 語法基礎與物件導向
PDF
啟動 Laravel 與環境設定
PDF
工作坊總結
PDF
應用程式部署
PDF
工作坊簡介
PDF
Package安裝與使用
課程簡介
專案啟動與設定
使用 Eloquent ORM
PHP 語法基礎與物件導向
啟動 Laravel 與環境設定
工作坊總結
應用程式部署
工作坊簡介
Package安裝與使用
Ad

Similar to CRUD 綜合應用 (6)

PDF
驗證與訊息
PDF
Laravel II - Developer Student Clubs NCU.pdf
PDF
Eloquent ORM
PDF
Eloquent ORM
PDF
使用者認證
PDF
Laravel - 系統全攻略
驗證與訊息
Laravel II - Developer Student Clubs NCU.pdf
Eloquent ORM
Eloquent ORM
使用者認證
Laravel - 系統全攻略

More from Shengyou Fan (20)

PDF
[JCConf 2024] Kotlin/Wasm:為 Kotlin 多平台帶來更多可能性
PDF
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
PDF
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
PDF
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
PDF
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
PDF
How I make a podcast website using serverless technology in 2023
PDF
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
PDF
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
PDF
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
PDF
Using the Exposed SQL Framework to Manage Your Database
PDF
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
PDF
[COSCUP 2022] Kotlin Collection 遊樂園
PDF
初探 Kotlin Multiplatform
PDF
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
PDF
[PHP 也有 Day #64] PHP 升級指南
PDF
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
PDF
Composer 經典食譜
PDF
老派浪漫:用 Kotlin 寫 Command Line 工具
PDF
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
PDF
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[JCConf 2024] Kotlin/Wasm:為 Kotlin 多平台帶來更多可能性
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
How I make a podcast website using serverless technology in 2023
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
Using the Exposed SQL Framework to Manage Your Database
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] Kotlin Collection 遊樂園
初探 Kotlin Multiplatform
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
[PHP 也有 Day #64] PHP 升級指南
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
Composer 經典食譜
老派浪漫:用 Kotlin 寫 Command Line 工具
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API

CRUD 綜合應用