17
Laravel 工作坊 連結 Controller shengyou @ 彰師大資工系學會 (2014.12.13)

連結 Controller

Embed Size (px)

Citation preview

Page 1: 連結 Controller

Laravel 工作坊連結 Controller

shengyou @ 彰師大資工系學會 (2014.12.13)

Page 2: 連結 Controller

階段任務• 把原本直接寫在 routes.php 裡的控制邏輯,搬到對應的 Controller 內

Page 3: 連結 Controller

Controller 介紹

Page 4: 連結 Controller

為什麼用 Controller?• 截至目前我們把所有應用程式邏輯都寫在

routes.php,雖然可以正常運作,但會讓

routes.php 一直長、一直長… 這樣寫下去程式遲早難以維護

• 所有程式邏輯沒有清楚的分類,若是其他人接手時,也很難找出運行脈絡

Page 5: 連結 Controller

什麼是 Controller?• 依照 MVC 原理,Route 處理 Request 並依應用程式邏輯分配給 Controller處理,由

Controller 操作 Models 及回傳 Views

• 將應用程式的裡將複雜的程式操作邏輯,獨立成 Class 以利維護,從 Class、Function 的命名就可以大致猜出其功能

Page 6: 連結 Controller

artisan controller:make• 產生 Controller 檔案

- 呼叫這個指令,artisan 會依提供的名稱產生 Controller 檔案並放置到 app/

controllers 底下

- 命名慣例 {‘M’odel複數}Controller

• 範例:$  php  artisan  controller:make  PostsController

Page 7: 連結 Controller

artisan generate:controller

• generator 版的產生指令

- 產生出來的檔案結果和官方版的一樣,只差在註解稍有不同

• 範例:$  php  artisan  generate:controller  PostsController

Page 8: 連結 Controller

Controller 結構• 產生出來的 Controller 依 RESTful 概念可區分出以下動作

動詞 路徑 動作 名稱

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

Page 9: 連結 Controller

設定 Route• 將動作轉給 Controller

Route::get(‘posts’,  ‘PostsController@index’);Route::get(‘posts/create’,  ‘PostsController@create’);Route::post(‘posts’,  ‘PostsController@store’);Route::get(‘posts/{id}’,  ‘PostsController@show’);Route::get(‘posts/{id}/edit’,  ‘PostsController@edit’);Route::patch(‘posts/{id}’,  ‘PostsController@update’);Route::delete(‘posts/{id}’,  ‘PostsController@destroy’);

Page 10: 連結 Controller

幫 Route 命名• 可以為每一個 Route 取一個名字,方便在

view 裡使用 route() helper 設定連結,Laravel 也會檢查 route 是否存在?

• 命名慣例:resources.verb//  routes.phpRoute::get(‘posts/{id}’,  [‘as’  =>  ‘posts.show’,  ‘uses’  =>  ‘PostsController@show’]);

//  app/views/home/index.blade.php<a  href=”{{  route(‘posts.show’,  $id)  }}”>Read  more</a>

Page 11: 連結 Controller

把邏輯搬離 Route• 把原本寫在 routes.php 裡的程式碼搬到對應的 Controller 裡的對應動作

• 修改 Views 裡原本的 url() 寫法,改成

route() 的寫法

//  app/controllers/PostsController.phppublic  function  show($id){        return  View::make(‘posts.show’);}

Page 12: 連結 Controller

整合 Model 送資料• 在 Controller 裡把該頁要顯示的資料用

Model 查詢出來,並送到 Views 裡//  app/controllers/PostsController.phppublic  function  show($id){        $post  =  Post::find($id);

       $data  =  compact(‘post’);                return  View::make(‘posts.show’,  $data);}

Page 13: 連結 Controller

在 Views 裡顯示資料• 當 Controller 把資料準備好送到 Views

後,在 Views 裡就可以直接取用該物件來顯示資料//  app/views/home/index.blade.php@foreach($posts  as  $post)        <h1>{{{  $post-­‐>title  }}}</h1>        <p>{{{  $post-­‐>content  }}}</p>@endforeach

Page 14: 連結 Controller

存檔點• 試著把現在已經可以運作的程式碼加入版本控制內

• 流程提醒:

- working directory > staging area > commit

Page 15: 連結 Controller

階段檢查表• 確認每一個頁面內都可以正確顯示,且資料內容都是依照資料庫查詢的結果排序

• 在頁面點選任一連結後,頁面顯示的內容也都是正確無誤的

Page 16: 連結 Controller

問與答學員可開始練習、實作

Page 17: 連結 Controller

單元小結• 在這個單元裡,我們學習如何把應用程式的控制邏輯從 Route 搬至 Controller,並在 Controller 裡查詢資料後,送至 View 裡顯示

• 下一個單元,我們將綜合應用所學,完成應用程式的所有 CRUD 動作