iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0
Software Development

Laravel 隨筆學習札記系列 第 15

Day15 - Laravel 的 Controller:讓代碼更有條理

  • 分享至 

  • xImage
  •  

昨天提到了 MVC,今天要來聊聊其中的 Controller 是什麼勒?

Controller?

我們來看看官方網站怎麼介紹 Controller

Instead of defining all of your request handling logic as closures in your route files, you may wish to organize this behavior using "controller" classes. Controllers can group related request handling logic into a single class. For example, a UserController class might handle all incoming requests related to users, including showing, creating, updating, and deleting users. By default, controllers are stored in the app/Http/Controllers directory.

我的理解大概是這樣,在寫程式碼覺得很困惑就來問問官網找找解答!

-- 初學者:什麼是 Controller ?

-- Laravel官網:Controller 用來整理請求邏輯,將相關邏輯放在一個類別裡。例如,UserController 處理所有與使用者有關的請求。

-- 初學者:會有什麼樣的請求呢?

-- Laravel官網可以顯示(showing)、創建(creating)、更新(updating)和刪除(deleting)使用者等等

-- 初學者:聽起來很方便!那 Controller 會放哪裡?

-- Laravel官網:Controller 會放在 app/Http/Controllers 這個資料夾裡,這樣管理起來更方便。


創建 Controller

使用 Artisan 命令 中的 make:controller 指令創建 Controller ,剛剛上面有聊到 Controller 會存放在 app/Http/Controllers

php artisan make:controller UserController

創建之後的檔案結構

<?php

namespace App\Http\Controllers; // 定義了這個控制器的命名空間,讓組織代碼和避免命名衝突。

use Illuminate\Http\Request; // 印用了 Request 類,讓我們可以在控制器中使用它們

class UserController extends Controller
{
    // 輸入要使用的方法
    
    // 這裡新增一個"show"方法
        public function show(string $id): View
    {
        return view('user.profile', [
            'user' => User::findOrFail($id)
        ]);
    }
}

我們可以定義一個路由到 UserControllershow 方法

use App\Http\Controllers\UserController;
 
Route::get('/user/{id}', [UserController::class, 'show']);

Single Action Controllers 單一行為控制器

當我們的 Controller 很複雜,可以使用 __invoke 方法來簡化結構,不需要指定方法名能直接操作 Controller 。

使用 Artisan 命令 中的 make:controller 指令並增加 --invokable 命令創建 Controller ,讓檔案內生成 invokable 方法

php artisan make:controller ProvisionServer --invokable

創建之後出現的檔案結構

namespace App\Http\Controllers;
 
class ProvisionServer extends Controller
{
    /**
     * Provision a new web server.
     */
    public function __invoke()  // 生成 invokable 方法
    {
        // ...
    }
}

我們可以定義一個路由到 ProvisionServer,這裡我們可以發現,因為我們使用 __invoke ,所以路由不用指定方法

use App\Http\Controllers\ProvisionServer;
 
Route::post('/server', ProvisionServer::class);

Resource Controllers 資源控制器

使用 Artisan 命令 中的 make:controller 指令並增加 --resource 命令創建 Controller ,在檔案內生成 CRUD 操作的方法

php artisan make:controller PostController --resource

創建之後出現的檔案結構,包含每個可用資源操作的方法:create、store、show、edit、update、destroy

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     */
    public function show(string $id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(string $id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, string $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {
        //
    }
}

我們可以定義一個路由到 resourceController,在這裡看到,因為使用 --resource ,遵循了 RESTful API 的設計原則,將會自動生成一組常用的 RESTful 路由

use App\Http\Controllers\resourceController;
 
Route::resource('resource', resourceController::class);

這裡來說說的目前對資源操作的方法的理解:這些方法形成了 RESTful 風格的 Controller ,有助於清楚處理 CRUD(創建、讀取、更新和刪除)

  1. index:顯示所有的資料
  2. create:新增資料
  3. store:將新增的資料儲存資料庫
  4. show:顯示指定的資料
  5. edit:顯示編輯資料的表單
  6. update:將編輯後的資料更新至資料庫
  7. destroy:刪除指定的資料

參考資料:

  1. Laravl官方網站 - Database: Controllers
  2. Day12 【Laravel 學習歷程】- 建立Controller控制器

踏著身心靈的塔羅腳步,轉向技術與邏輯的工程師之路,就藉由塔羅日抽來紀錄今日的學習與生活吧!

聖杯八:今天第15天了,走完一半惹~再繼續勇敢地踏上未知之旅的主題!

“If you walk the footsteps of a stranger, you'll learn things you never knew you never knew. “

如果你願意踏上陌生的足跡,你將會發現那些你從未察覺的美好與智慧。

— Pocahontas, Pocahontas


上一篇
Day14 - 從菜單到訂單:MVC 架構的完整旅程
下一篇
Day16 - 資料的守護者:如何使用 Laravel Model 的屬性
系列文
Laravel 隨筆學習札記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言