iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
自我挑戰組

我推的Laravel系列 第 7

【Day-6】我推的Laravel-基礎篇-MVC的C

  • 分享至 

  • xImage
  •  

簡介

先前我們介紹了路由以及Model,一般來說流程大概是
使用者→View→Controller→Model
前一篇從最後面開始Model開始,現在開始介紹Controller

Controller可以翻作控制器,為什麼要使用控制器呢?
上篇我們已經提到MVC分工的好處
想像一下,今天我要取得資料庫裡資料表posts的post並依據使用者的條件篩選、排序
或者需要呼叫第三方API取得物流資料、金流付款,整理並回傳到使用者端(可能還需要新增到資料庫)
這些都是控制器需要去控制

Contoller

還記得這張圖嗎
https://ithelp.ithome.com.tw/upload/images/20230919/201632860DynphspLD.png
(忘記或沒看過請去看這篇

今天就用這張建構圖來完成第一個RESTful API Controller吧!

routes/web.php
https://ithelp.ithome.com.tw/upload/images/20230921/20163286BDz95KqAQt.png

Route::get('posts', [PostController::class, 'index']);
Route::post('posts', [PostController::class, 'store']);
Route::patch('posts/{post}', [PostController::class, 'update']);
Route::delete('posts/{post}', [PostController::class, 'destory']);

app\Http\Controllers\PostController.php
https://ithelp.ithome.com.tw/upload/images/20230921/20163286WyMcYWopka.png

public function index(){
    return Post::all();
}

public function create(){
    // View 的下章介紹
    return view('posts.create');
}

public function store(){
    Post::create(request()->only(array('title', 'content')));
}

public function show(){
    // View 的下章介紹
    return view('posts.show');
}

public function edit(){
    // View 的下章介紹
    return view('posts.edit');
}

public function update(Post $post){
    $data = request()->only(array('title', 'content'));
    $post->update($data);
}

public function destory(Post $post){
    $post->delete();
}

Postman

Postman是測試API的一個方便的工具

簡單在這邊演示:
index:
https://ithelp.ithome.com.tw/upload/images/20230921/20163286bQYTnTcOdk.png

store
https://ithelp.ithome.com.tw/upload/images/20230921/20163286CUMBgDxmWN.png
(沒有回傳

storeindex
https://ithelp.ithome.com.tw/upload/images/20230921/20163286QlzBdf2ZJG.png

update
https://ithelp.ithome.com.tw/upload/images/20230921/20163286DcDL9O2bfo.png
*patch為甚麼要用x-www-url-formurlencoded
(沒有回傳

updateindex
https://ithelp.ithome.com.tw/upload/images/20230921/20163286evdPAZ8WmY.png

delete
https://ithelp.ithome.com.tw/upload/images/20230921/20163286ssxdKnigSQ.png

deleteindex
https://ithelp.ithome.com.tw/upload/images/20230921/20163286twIKFplgFn.png

測試store的時候出現

一、
https://ithelp.ithome.com.tw/upload/images/20230921/20163286h867CVEJfO.png
這是因為我們用的web.php有CSRF檢測(CSRF Middleware),如果用Postman會被擋下
因為是本地測試先將CSRF檢測關閉,之後在View的時候可以把其開啟
app\Http\Kernel.php
https://ithelp.ithome.com.tw/upload/images/20230921/201632862P5IuoWlly.jpg
將紅框註解(如圖
重要!這是本地測試,正式環境請不要這樣使用
重要!這是本地測試,正式環境請不要這樣使用
重要!這是本地測試,正式環境請不要這樣使用
開發純API可以使用routes/api.php,筆者是之後會搭配View才使用web.php

CSRF
跨站請求偽造 (Cross-site request forgery),跨站請求偽造,也被稱為one-click attack或者session riding,通常縮寫為CSRF或者XSRF,是一種挾制使用者在當前已登入的Web應用程式上執行非本意的操作的攻擊方法。

簡單來說就是如果你自家的網站的表單,不想被外部的網站請求,就需要CSRF防護

二、
https://ithelp.ithome.com.tw/upload/images/20230921/201632860y314KTYQI.png
*Add [title] to fillable property to allow mass assignment on [App\Models\Post]
https://ithelp.ithome.com.tw/upload/images/20230921/20163286JDqciajK4K.png

$fillable是Model的方法之一,代表資料表的 欄位哪些可以被寫入
$fillable 相對應的是 $guarded
$guarded代表 欄位哪些不可以被寫入
如果要全部都可以寫入

protected $guarded = [];

dd($variable)

Laravel提供了一個方便的debug方法,就是dd();

https://ithelp.ithome.com.tw/upload/images/20230921/20163286G6G8lMSf0y.png

https://ithelp.ithome.com.tw/upload/images/20230921/20163286HP6k7GKSJx.png

https://ithelp.ithome.com.tw/upload/images/20230921/20163286u2CT1agD7I.png

3.(基本上)全部都可以dd出來
https://ithelp.ithome.com.tw/upload/images/20230921/20163286fRBixMbUSK.png

總結

今天大致帶過Controller的美妙,還有簡易測試的方式
相信我,Contoller的美妙不只如此,而且之後還會一直用到

控制器(Controller)是應用的大廚,每一行代碼都是一道菜。 - Chatgpt


上一篇
【Day-5】我推的Laravel-基礎篇-MVC與MVC的M
下一篇
【Day-7】我推的Laravel-基礎篇-MVC的V
系列文
我推的Laravel31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言