对於请求的处理如果都写在路由器内那就太挤了,再 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
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');
}
}
通常一个控制器都是针对某一个 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'
]);
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 的控制器,只是少了 create/edit 方法,其他都跟 resource 指令的结果相同
sail artisan make:controller PhotoController --api
前言 今天要来继续介绍 NumPy 的应用,包括了 Slicing 索引,Copy, View 复制...
这次要来细讲回圈了 上次说到回圈有分成:1. for回圈,2. while回圈以及3. do whi...
用最简单的方式Ctrl+C&Ctrl+V把场景往上延伸,Ctrl+D也可以直接复制此物件,看...
JAVA - Windows 10 安装 Maven 参考资料 参考:(一)maven 新手教学: ...
我们已经顺利的将 onEdit(e) 以及 MailApp.sendMail(message) 学完...