Controller

对於请求的处理如果都写在路由器内那就太挤了,再 Laravel 中判定路由後都会将请求传递到控制器进行对应。

建立基本控制器

可以用指令建立控制器

sail artisan make:controller <ContorllerName>

建立好的控制器预设放在 App\Http\Controllers 资料夹中,并且 namespace 也是。

建好的空控制器

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    //
}

在这当中定义处理函式,跟前面路由器的 Callback 定义方式相同,可以带上依赖注入的 Requeset 实例跟路径参数,或是跟 Model 进行绑定

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
     /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Photo  $photo
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Photo $photo)
    {
        //
    }
}

串接路由与控制器

在路由器中引入控制器,并指定控制器中的方法给指定路由

// api.php
use App\Http\Controllers\UserController;

Route::get('/user/{id}', [UserController::class, 'show']);

加上 Middleware

可以在路由器中加上 Middleware

Route::get('profile', [UserController::class, 'show'])->middleware('auth');

也可以加在控制器中,这样经由这个控制器处理的请求都会先经过 Middleware 处理

class UserController extends Controller
{
    /**
     * Instantiate a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('log')->only('index');
        $this->middleware('subscribed')->except('store');
    }
}

Resource 路由与控制器

通常一个控制器都是针对某一个 Model 进行处理,像是 UserController 负责处理 User 的 CRUD ,而因为对各 Model 的这类处理都大同小异, Laravel 就预设了快捷的 API 的定义方式

//web.php
Route::resource('photos', PhotoController::class);

Route::resource 当中包含了一组完整的CRUD 路由定义,而每个路由对应到控制器中的方法名称也都指定好了,对照表如下:

请求方法 路由 控制器函式 路由名称标签
GET /photos index photos.index
GET /photos/create create photos.create
POST /photos store photos.store
GET /photos/{photo} show photos.show
GET /photos/{photo}/edit edit photos.edit
PUT/PATCH /photos/{photo} update photos.update
DELETE /photos/{photo} destroy photos.destroy

{photo} 的部分通常是带入主键 Id 的值,用来查询单笔资料,对应的方法也都是用来处理单笔资料的。

Route::resource 主要是用来处理浏览器端(web.php)的请求,所以会包含要求建立/编辑表单画面的 create/edit 路由。

而像是手机 App 来的请求不会用到 create/edit ,因为 App 都内建画面了,所以也有另外的方法对应这方面的 api

// api.php
use App\Http\Controllers\PhotoController;

Route::apiResource('photos', PhotoController::class);

如上所述, apiResource 跟 resource 路由相比只是少了 create/edit 方法。

如果 resource 中有不需要的路由或是只需要其中几个路由,可以再加定义

use App\Http\Controllers\PhotoController;

// 剔除不需要的路由
Route::resource('photos', PhotoController::class)->except([
    'create', 'store', 'update', 'destroy'
]);

// 只取需要的路由
Route::resource('photos', PhotoController::class)->only([
    'index', 'show'
]);

指令产生 resource 控制器

Laravel 提供了快捷的指令产生可以对应 resource 路由的控制器

sail artisan make:controller PhotoController --resource

这样生成的控制器中会先生成 index/create 等对应 Route::resource 的空函式,也会定义好预设的参数,以 show 为例

/**
 * Display the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function show($id)
{
    //
}

会先定义好路径参数为 $id。

如果想略过用 $id 查询资料的步骤,可以直接建立与 Model 连结的控制器

sail artisan make:controller PhotoController --resource --model=Photo

指定了 Model 的话,参数会直接变成该 Model 的型别,根据上一篇路由绑定 Model 的说明,就可以直接取出该 id 对应的资料进行处理

/**
 * Display the specified resource.
 *
 * @param  \App\Models\Photo  $photo
 * @return \Illuminate\Http\Response
 */
public function show(Photo $photo)
{
    //
}

指令产生 apiResource 控制器

产生对应 apiResource 的控制器,只是少了 create/edit 方法,其他都跟 resource 指令的结果相同

sail artisan make:controller PhotoController --api

References

Laravel Controller

<<:  Day-10 heap与heap sort

>>:  当责:实践篇

【Day 26】NumPy (3):Slicing, Copy, View, shape, Concatenate

前言 今天要来继续介绍 NumPy 的应用,包括了 Slicing 索引,Copy, View 复制...

[iT铁人赛Day11]JAVA回圈

这次要来细讲回圈了 上次说到回圈有分成:1. for回圈,2. while回圈以及3. do whi...

30天轻松学会unity自制游戏-往前移动

用最简单的方式Ctrl+C&Ctrl+V把场景往上延伸,Ctrl+D也可以直接复制此物件,看...

JAVA - Windows 10 安装 Maven

JAVA - Windows 10 安装 Maven 参考资料 参考:(一)maven 新手教学: ...

Day 7— 自动化回信机(4) 勾选後寄出通知信

我们已经顺利的将 onEdit(e) 以及 MailApp.sendMail(message) 学完...