SlideShare a Scribd company logo
1 of 25
Download to read offline
使⽤用 Controller
范聖佑 Shengyou Fan
臺中科⼤大資⼯工系 (2015/06/14)
適
⽤用
5.0
版
單元主題
• 什麼是 Controller?
• ⺫⽬目前實作⽅方式有什麼問題?Controller 可以幫助我們
什麼?
• 如何透過 artisan 產⽣生 Controller 類別?
• Controller 類別如何依照 RESTful 慣例實作各⽅方法
• ⽰示範將⼯工作坊實作專案裡,原本寫在 routes.php 裡
的動作搬⾄至對應的 Controller 類別內
Controller	
  簡介
Laravel 的 MVC 分⼯工
Route
Controller
ModelView
index.php
Server
Request
Response
Client
app init
★ 參考說明:http://laravel-recipes.com/recipes/52/understanding-the-request-lifecycle
在有 Controller 之前…
• 截⾄至⺫⽬目前的⽰示範,我們把所有應⽤用程式邏輯都寫在
app/Http/routes.php 裡,雖然可以正常運作,但會讓
routes.php 的內容⼀一直⻑⾧長、⼀一直⻑⾧長…
• 各⾴頁⾯面的程式邏輯沒有清楚的分類,若是其他⼈人接
⼿手時,也很難找出整個應⽤用程式的運⾏行脈絡,這樣
寫下去程式遲早難以維護…
• 總結來說,就是⺫⽬目前的範例只⽤用到 M 及V,該是 C
介⼊入的時候了!
什麼是 MVC 的 Controller?
• MVC 設計架構裡,M 代表 Model 負責處理資料;V
代表View 負責顯⽰示⾴頁⾯面;C 代表 Controller 負責控
制 M 及V 間的溝通並回傳結果
• 在此架構設計下,Controller 的功能就是負責控制 M
及V,也就是接受來⾃自 Route 的指令,將所需要顯⽰示
的資料和⾴頁⾯面整理好回傳。也可以思考成將動作分
類的⼀一種⽅方式
• 如此即可讓 顯⽰示 (V) 與 程式控制 (C)、商業邏輯 (M)
三者獨⽴立開來,彼此分⼯工、互相合作
Laravel 的 Controller 機制
• 在 Laravel 的 app/Http/routes.php 裡,可以分別將不
同的 Route 動作指定給不同的 Controller 來處理,
⽽而每⼀一個 Controller 內也可以有不同的⽅方法,處理
來⾃自不同 Route 傳來的請求
• ⼀一般來說,Controller 內的動作也有慣例,即依照
RESTful 的動作名稱來做對應,讓不同的 Controller
及各 Controller 內的動作都有規則可循。除了可以
依賴 artisan 產⽣生程式碼外,也可提升開發速度
產⽣生	
  Controller
★ 參考⽂文件:http://laravel.com/docs/5.0/controllers#restful-resource-controllers
產⽣生 Controller 類別
• artisan 內建就有幫我們產⽣生 Controller 的指令,
直接呼叫 make:controller 即可
• 預設產⽣生出來的 Controller 就⽀支援 RESTful 的設計,
若要產⽣生出「空⽩白 (plain) 」的 Controller 則要額外
下參數
$	
  [php]	
  artisan	
  make:controller	
  	
  
{name}
產⽣生	
  controller	
  檔案
artisan	
  make:controller
• 透過 artisan 產⽣生 Controller 類別
- artisan	
  會依照給予的名稱,產⽣生類別檔案	
  
- -­‐-­‐plain	
  預設指令會⾃自動在 Controller 類別裡產⽣生
對應的 RESTful 的各種⽅方法,若不希望⾃自動產⽣生的
話,可加上這個參數
• 範例:
$	
  php	
  artisan	
  make:controller	
  PostsController	
  
$	
  php	
  artisan	
  make:controller	
  ContactsController	
  -­‐-­‐plain
產⽣生 Controller 檔案
使⽤用 artisan 產⽣生 Controller 檔案
命名與指令慣例
• 雖然 Laravel 沒有強制規定,但⼀一般慣例會將
Controller 以 {⼤大駝峰、資源複數名稱}Controller 來
命名,如 PostsController
• 預設 Controller 檔案會放置在 app/Http/Controllers/
資料夾底下
• 假如要變更 Controller 檔案的放置位置,別忘了要
⼀一併更改 namespace,並在更改完成後執⾏行
composer	
  dump-­‐autoload 更新 Class Map
撰寫	
  Controller	
  內容
Controller 結構
• Laravel 的 Controller 會先繼承⾃自 BaseController
(IlluminateRoutingController) 以繼承⼤大多數的
Controller 功能成
AppHttpControllersControllerController.php
• ⽽而產⽣生出來的每⼀一個 Controller ⽽而其⼜又繼承⾃自
AppHttpControllersControllerController.php 若是
在應⽤用程式層級需要有共同的屬性與⽅方法時,可以
統⼀一集中寫在這裡,讓其他⼦子 Controller 可以透過
繼承就有相同的能⼒力
• 各 Controller 再依 RESTful 慣例實作各⽅方法的內容
RESTful Controller 範例
RESTful 動作對應
• Laravel 的 RESTful Controler 動作對應依以下表格:
動詞 路徑 動作 名稱
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
設定 Route
• 在 Route 裡設定將請求轉給 Controller@action,
並依照 RESTful 慣例為 Route 命名
• Route 命名慣例:resources.verb
//	
  app/Http/routes.php	
  
Route::get('posts',	
  ['as'	
  =>	
  'posts.index',	
  'uses'	
  =>	
  
'PostsController@index']);	
  
Route::get('posts/create',	
  ['as'	
  =>	
  'posts.create',	
  'uses'	
  
=>	
  'PostsController@create');	
  
Route::get('posts/{id}',	
  ['as'	
  =>	
  'posts.show',	
  'uses'	
  =>	
  
'PostsController@show']);	
  
Route::get('posts/{id}/edit',	
  ['as'	
  =>	
  'posts.edit',	
  'uses'	
  
=>	
  'PostsController@edit']);
將查詢結果送到View
• 在 Controller 裡把該⾴頁要顯⽰示的資料⽤用 Model 查詢
出來,並送到Views 裡
//	
  app/Http/Controllers/PostsController.php	
  
public	
  function	
  index()	
  
{	
  
	
  	
  	
  	
  $posts	
  =	
  AppPost::all();	
  
	
  	
  	
  	
  $data	
  =	
  compact('posts');	
  
	
  	
  	
  	
  return	
  view('posts.index',	
  $data);	
  
}	
  
public	
  function	
  show($id)	
  
{	
  
	
  	
  	
  	
  $post	
  =	
  AppPost::find($id);	
  
	
  	
  	
  	
  $data	
  =	
  compact('post');	
  
	
  	
  	
  	
  return	
  view('posts.show',	
  $data);	
  
}
在View 裡顯⽰示 Model 資料
• 當 Controller 把資料準備好送到View 後,在View 裡
就可以直接取得 Model 或 Collection 來顯⽰示資料
//	
  app/views/posts/index.blade.php	
  
//	
  $posts	
  是	
  Collection	
  
//	
  $post	
  是	
  Model	
  
@foreach($posts	
  as	
  $post)	
  
	
  	
  	
  	
  <h2>{{	
  $post-­‐>title	
  }}</h2>	
  
	
  	
  	
  	
  <h3>{{	
  $post-­‐>sub_title	
  }}</h3>	
  
	
  	
  	
  	
  <p>{!!	
  $post-­‐>content	
  !!}</p>	
  
@endforeach	
  
//	
  app/views/posts/show.blade.php	
  
//	
  $post	
  是	
  Model	
  
<h1>{{	
  $post-­‐>title	
  }}</h1>	
  
<h2>{{	
  $post-­‐>sub_title	
  }}</h2>	
  
<p>{!!	
  $post-­‐>content	
  !!}</p>
實作專案	
  Controller
產⽣生專案所需 Controller
• 依專案所需產⽣生三個 Controller
• 把 app/Http/routes.php 裡的邏輯搬到對應的
Controller,並把 Route 的內容修改對應
• 運⽤用 Model 將資料從資料庫提取出來,並⽤用
Controller 把 Model 送到View
• 測試所有⾴頁⾯面是否正確顯⽰示
存檔點
• 試著把現在已經可以運作的程式碼加⼊入版本控制內
• 流程提醒:
- working directory > staging area > commit
單元總結
• 在這個單元裡我們學到了些什麼?
- MVC 裡的 Controller
- 使⽤用 artisan 產⽣生 Controller 類別
- 依照 RESTful 慣例實作 Controller 裡的各⽅方法
- 依照 RESTful 慣例將 Route 與 Controller 接起來
- 實作專案所需的 Controller,並整理 Route 設定
Q & A
歡迎提問討論

More Related Content

What's hot

開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
專案啟動與環境設定
專案啟動與環境設定專案啟動與環境設定
專案啟動與環境設定Shengyou Fan
 
啟動 Laravel 與環境設定
啟動 Laravel 與環境設定啟動 Laravel 與環境設定
啟動 Laravel 與環境設定Shengyou Fan
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 SeedingShengyou Fan
 
開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由Shengyou Fan
 
Composer 套件管理
Composer 套件管理Composer 套件管理
Composer 套件管理Shengyou Fan
 
應用程式部署
應用程式部署應用程式部署
應用程式部署Shengyou Fan
 
COSCUP 2016 Laravel 部署工作坊 - 部署指南
COSCUP 2016 Laravel 部署工作坊 - 部署指南COSCUP 2016 Laravel 部署工作坊 - 部署指南
COSCUP 2016 Laravel 部署工作坊 - 部署指南Shengyou Fan
 
Route 路由控制
Route 路由控制Route 路由控制
Route 路由控制Shengyou Fan
 

What's hot (20)

開發環境建置
開發環境建置開發環境建置
開發環境建置
 
專案啟動與環境設定
專案啟動與環境設定專案啟動與環境設定
專案啟動與環境設定
 
啟動 Laravel 與環境設定
啟動 Laravel 與環境設定啟動 Laravel 與環境設定
啟動 Laravel 與環境設定
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
使用者認證
使用者認證使用者認證
使用者認證
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
 
CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 Seeding
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
 
給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由
 
Composer 套件管理
Composer 套件管理Composer 套件管理
Composer 套件管理
 
工作坊總結
工作坊總結工作坊總結
工作坊總結
 
驗證與訊息
驗證與訊息驗證與訊息
驗證與訊息
 
工作坊總結
工作坊總結工作坊總結
工作坊總結
 
工作坊簡介
工作坊簡介工作坊簡介
工作坊簡介
 
Route 機制
Route 機制Route 機制
Route 機制
 
整合 Open ID
整合 Open ID整合 Open ID
整合 Open ID
 
應用程式部署
應用程式部署應用程式部署
應用程式部署
 
COSCUP 2016 Laravel 部署工作坊 - 部署指南
COSCUP 2016 Laravel 部署工作坊 - 部署指南COSCUP 2016 Laravel 部署工作坊 - 部署指南
COSCUP 2016 Laravel 部署工作坊 - 部署指南
 
Route 路由控制
Route 路由控制Route 路由控制
Route 路由控制
 

Viewers also liked

View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
Migrations 與 Schema操作
Migrations 與 Schema操作Migrations 與 Schema操作
Migrations 與 Schema操作Shengyou Fan
 
使用 Eloquent ORM
使用 Eloquent ORM使用 Eloquent ORM
使用 Eloquent ORMShengyou Fan
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
開發流程與工具介紹
開發流程與工具介紹開發流程與工具介紹
開發流程與工具介紹Shengyou Fan
 
Schema & Migration操作
Schema & Migration操作Schema & Migration操作
Schema & Migration操作Shengyou Fan
 
專案啟動與設定
專案啟動與設定專案啟動與設定
專案啟動與設定Shengyou Fan
 
Model & Seeding整合
Model & Seeding整合Model & Seeding整合
Model & Seeding整合Shengyou Fan
 

Viewers also liked (13)

CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
工作坊簡介
工作坊簡介工作坊簡介
工作坊簡介
 
Migrations 與 Schema操作
Migrations 與 Schema操作Migrations 與 Schema操作
Migrations 與 Schema操作
 
Eloquent ORM
Eloquent ORMEloquent ORM
Eloquent ORM
 
課程簡介
課程簡介課程簡介
課程簡介
 
使用 Eloquent ORM
使用 Eloquent ORM使用 Eloquent ORM
使用 Eloquent ORM
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
開發流程與工具介紹
開發流程與工具介紹開發流程與工具介紹
開發流程與工具介紹
 
Schema & Migration操作
Schema & Migration操作Schema & Migration操作
Schema & Migration操作
 
CRUD 綜合應用
CRUD 綜合應用CRUD 綜合應用
CRUD 綜合應用
 
專案啟動與設定
專案啟動與設定專案啟動與設定
專案啟動與設定
 
Model & Seeding整合
Model & Seeding整合Model & Seeding整合
Model & Seeding整合
 

Similar to 使用 Controller

Vlog02 [eng sub]什麼是controller和如何在asp.net核心中創建controller?-what is controller ...
Vlog02  [eng sub]什麼是controller和如何在asp.net核心中創建controller?-what is controller ...Vlog02  [eng sub]什麼是controller和如何在asp.net核心中創建controller?-what is controller ...
Vlog02 [eng sub]什麼是controller和如何在asp.net核心中創建controller?-what is controller ...SernHao TV
 
Spring mvc
Spring mvcSpring mvc
Spring mvcpepsixp
 
How to ASP.NET MVC4
How to ASP.NET MVC4How to ASP.NET MVC4
How to ASP.NET MVC4Daniel Chou
 
Real World ASP.NET MVC
Real World ASP.NET MVCReal World ASP.NET MVC
Real World ASP.NET MVCjeffz
 
twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC
 
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Justin Lin
 
Rest Ruby On Rails
Rest Ruby On RailsRest Ruby On Rails
Rest Ruby On Railsshaokun
 
Asp.net mvc 培训
Asp.net mvc 培训Asp.net mvc 培训
Asp.net mvc 培训lotusprince
 
Rails hackathon
Rails hackathonRails hackathon
Rails hackathon政億 林
 
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練3
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練32015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練3
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練3Duran Hsieh
 
Introduction to ASP.NET MVC and MVC 5 Features
Introduction to ASP.NET MVC and MVC 5 FeaturesIntroduction to ASP.NET MVC and MVC 5 Features
Introduction to ASP.NET MVC and MVC 5 FeaturesJeff Chu
 
Introduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xIntroduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xBo-Yi Wu
 
與 Asp.net mvc 的第一次親密接觸 - twMVC#1
與 Asp.net mvc 的第一次親密接觸 - twMVC#1與 Asp.net mvc 的第一次親密接觸 - twMVC#1
與 Asp.net mvc 的第一次親密接觸 - twMVC#1twMVC
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Wade Huang
 
Uliweb cheat sheet_0.1
Uliweb cheat sheet_0.1Uliweb cheat sheet_0.1
Uliweb cheat sheet_0.1modou li
 
OpenWebSchool - 11 - CodeIgniter
OpenWebSchool - 11 - CodeIgniterOpenWebSchool - 11 - CodeIgniter
OpenWebSchool - 11 - CodeIgniterHung-yu Lin
 
Mvc training
Mvc trainingMvc training
Mvc trainingxioxu
 
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練42015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4Duran Hsieh
 
Single-Page Application Design Principles 101
Single-Page Application Design Principles 101Single-Page Application Design Principles 101
Single-Page Application Design Principles 101Jollen Chen
 

Similar to 使用 Controller (20)

Vlog02 [eng sub]什麼是controller和如何在asp.net核心中創建controller?-what is controller ...
Vlog02  [eng sub]什麼是controller和如何在asp.net核心中創建controller?-what is controller ...Vlog02  [eng sub]什麼是controller和如何在asp.net核心中創建controller?-what is controller ...
Vlog02 [eng sub]什麼是controller和如何在asp.net核心中創建controller?-what is controller ...
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
How to ASP.NET MVC4
How to ASP.NET MVC4How to ASP.NET MVC4
How to ASP.NET MVC4
 
Real World ASP.NET MVC
Real World ASP.NET MVCReal World ASP.NET MVC
Real World ASP.NET MVC
 
twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸
 
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
 
Rest Ruby On Rails
Rest Ruby On RailsRest Ruby On Rails
Rest Ruby On Rails
 
Asp.net mvc 培训
Asp.net mvc 培训Asp.net mvc 培训
Asp.net mvc 培训
 
Rails hackathon
Rails hackathonRails hackathon
Rails hackathon
 
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練3
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練32015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練3
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練3
 
RESTful
RESTfulRESTful
RESTful
 
Introduction to ASP.NET MVC and MVC 5 Features
Introduction to ASP.NET MVC and MVC 5 FeaturesIntroduction to ASP.NET MVC and MVC 5 Features
Introduction to ASP.NET MVC and MVC 5 Features
 
Introduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xIntroduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.x
 
與 Asp.net mvc 的第一次親密接觸 - twMVC#1
與 Asp.net mvc 的第一次親密接觸 - twMVC#1與 Asp.net mvc 的第一次親密接觸 - twMVC#1
與 Asp.net mvc 的第一次親密接觸 - twMVC#1
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
 
Uliweb cheat sheet_0.1
Uliweb cheat sheet_0.1Uliweb cheat sheet_0.1
Uliweb cheat sheet_0.1
 
OpenWebSchool - 11 - CodeIgniter
OpenWebSchool - 11 - CodeIgniterOpenWebSchool - 11 - CodeIgniter
OpenWebSchool - 11 - CodeIgniter
 
Mvc training
Mvc trainingMvc training
Mvc training
 
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練42015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
 
Single-Page Application Design Principles 101
Single-Page Application Design Principles 101Single-Page Application Design Principles 101
Single-Page Application Design Principles 101
 

More from Shengyou Fan

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

More from Shengyou Fan (20)

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

使用 Controller

  • 1. 使⽤用 Controller 范聖佑 Shengyou Fan 臺中科⼤大資⼯工系 (2015/06/14) 適 ⽤用 5.0 版
  • 2. 單元主題 • 什麼是 Controller? • ⺫⽬目前實作⽅方式有什麼問題?Controller 可以幫助我們 什麼? • 如何透過 artisan 產⽣生 Controller 類別? • Controller 類別如何依照 RESTful 慣例實作各⽅方法 • ⽰示範將⼯工作坊實作專案裡,原本寫在 routes.php 裡 的動作搬⾄至對應的 Controller 類別內
  • 4. Laravel 的 MVC 分⼯工 Route Controller ModelView index.php Server Request Response Client app init ★ 參考說明:http://laravel-recipes.com/recipes/52/understanding-the-request-lifecycle
  • 5. 在有 Controller 之前… • 截⾄至⺫⽬目前的⽰示範,我們把所有應⽤用程式邏輯都寫在 app/Http/routes.php 裡,雖然可以正常運作,但會讓 routes.php 的內容⼀一直⻑⾧長、⼀一直⻑⾧長… • 各⾴頁⾯面的程式邏輯沒有清楚的分類,若是其他⼈人接 ⼿手時,也很難找出整個應⽤用程式的運⾏行脈絡,這樣 寫下去程式遲早難以維護… • 總結來說,就是⺫⽬目前的範例只⽤用到 M 及V,該是 C 介⼊入的時候了!
  • 6. 什麼是 MVC 的 Controller? • MVC 設計架構裡,M 代表 Model 負責處理資料;V 代表View 負責顯⽰示⾴頁⾯面;C 代表 Controller 負責控 制 M 及V 間的溝通並回傳結果 • 在此架構設計下,Controller 的功能就是負責控制 M 及V,也就是接受來⾃自 Route 的指令,將所需要顯⽰示 的資料和⾴頁⾯面整理好回傳。也可以思考成將動作分 類的⼀一種⽅方式 • 如此即可讓 顯⽰示 (V) 與 程式控制 (C)、商業邏輯 (M) 三者獨⽴立開來,彼此分⼯工、互相合作
  • 7. Laravel 的 Controller 機制 • 在 Laravel 的 app/Http/routes.php 裡,可以分別將不 同的 Route 動作指定給不同的 Controller 來處理, ⽽而每⼀一個 Controller 內也可以有不同的⽅方法,處理 來⾃自不同 Route 傳來的請求 • ⼀一般來說,Controller 內的動作也有慣例,即依照 RESTful 的動作名稱來做對應,讓不同的 Controller 及各 Controller 內的動作都有規則可循。除了可以 依賴 artisan 產⽣生程式碼外,也可提升開發速度
  • 9. 產⽣生 Controller 類別 • artisan 內建就有幫我們產⽣生 Controller 的指令, 直接呼叫 make:controller 即可 • 預設產⽣生出來的 Controller 就⽀支援 RESTful 的設計, 若要產⽣生出「空⽩白 (plain) 」的 Controller 則要額外 下參數
  • 10. $  [php]  artisan  make:controller     {name} 產⽣生  controller  檔案
  • 11. artisan  make:controller • 透過 artisan 產⽣生 Controller 類別 - artisan  會依照給予的名稱,產⽣生類別檔案   - -­‐-­‐plain  預設指令會⾃自動在 Controller 類別裡產⽣生 對應的 RESTful 的各種⽅方法,若不希望⾃自動產⽣生的 話,可加上這個參數 • 範例: $  php  artisan  make:controller  PostsController   $  php  artisan  make:controller  ContactsController  -­‐-­‐plain
  • 12. 產⽣生 Controller 檔案 使⽤用 artisan 產⽣生 Controller 檔案
  • 13. 命名與指令慣例 • 雖然 Laravel 沒有強制規定,但⼀一般慣例會將 Controller 以 {⼤大駝峰、資源複數名稱}Controller 來 命名,如 PostsController • 預設 Controller 檔案會放置在 app/Http/Controllers/ 資料夾底下 • 假如要變更 Controller 檔案的放置位置,別忘了要 ⼀一併更改 namespace,並在更改完成後執⾏行 composer  dump-­‐autoload 更新 Class Map
  • 15. Controller 結構 • Laravel 的 Controller 會先繼承⾃自 BaseController (IlluminateRoutingController) 以繼承⼤大多數的 Controller 功能成 AppHttpControllersControllerController.php • ⽽而產⽣生出來的每⼀一個 Controller ⽽而其⼜又繼承⾃自 AppHttpControllersControllerController.php 若是 在應⽤用程式層級需要有共同的屬性與⽅方法時,可以 統⼀一集中寫在這裡,讓其他⼦子 Controller 可以透過 繼承就有相同的能⼒力 • 各 Controller 再依 RESTful 慣例實作各⽅方法的內容
  • 17. RESTful 動作對應 • Laravel 的 RESTful Controler 動作對應依以下表格: 動詞 路徑 動作 名稱 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
  • 18. 設定 Route • 在 Route 裡設定將請求轉給 Controller@action, 並依照 RESTful 慣例為 Route 命名 • Route 命名慣例:resources.verb //  app/Http/routes.php   Route::get('posts',  ['as'  =>  'posts.index',  'uses'  =>   'PostsController@index']);   Route::get('posts/create',  ['as'  =>  'posts.create',  'uses'   =>  'PostsController@create');   Route::get('posts/{id}',  ['as'  =>  'posts.show',  'uses'  =>   'PostsController@show']);   Route::get('posts/{id}/edit',  ['as'  =>  'posts.edit',  'uses'   =>  'PostsController@edit']);
  • 19. 將查詢結果送到View • 在 Controller 裡把該⾴頁要顯⽰示的資料⽤用 Model 查詢 出來,並送到Views 裡 //  app/Http/Controllers/PostsController.php   public  function  index()   {          $posts  =  AppPost::all();          $data  =  compact('posts');          return  view('posts.index',  $data);   }   public  function  show($id)   {          $post  =  AppPost::find($id);          $data  =  compact('post');          return  view('posts.show',  $data);   }
  • 20. 在View 裡顯⽰示 Model 資料 • 當 Controller 把資料準備好送到View 後,在View 裡 就可以直接取得 Model 或 Collection 來顯⽰示資料 //  app/views/posts/index.blade.php   //  $posts  是  Collection   //  $post  是  Model   @foreach($posts  as  $post)          <h2>{{  $post-­‐>title  }}</h2>          <h3>{{  $post-­‐>sub_title  }}</h3>          <p>{!!  $post-­‐>content  !!}</p>   @endforeach   //  app/views/posts/show.blade.php   //  $post  是  Model   <h1>{{  $post-­‐>title  }}</h1>   <h2>{{  $post-­‐>sub_title  }}</h2>   <p>{!!  $post-­‐>content  !!}</p>
  • 22. 產⽣生專案所需 Controller • 依專案所需產⽣生三個 Controller • 把 app/Http/routes.php 裡的邏輯搬到對應的 Controller,並把 Route 的內容修改對應 • 運⽤用 Model 將資料從資料庫提取出來,並⽤用 Controller 把 Model 送到View • 測試所有⾴頁⾯面是否正確顯⽰示
  • 24. 單元總結 • 在這個單元裡我們學到了些什麼? - MVC 裡的 Controller - 使⽤用 artisan 產⽣生 Controller 類別 - 依照 RESTful 慣例實作 Controller 裡的各⽅方法 - 依照 RESTful 慣例將 Route 與 Controller 接起來 - 實作專案所需的 Controller,並整理 Route 設定