- Laravel 教程
- Laravel - 首页
- Laravel - 概述
- Laravel - 安装
- Laravel - 应用结构
- Laravel - 配置
- Laravel - 路由
- Laravel - 中间件
- Laravel - 命名空间
- Laravel - 控制器
- Laravel - 请求
- Laravel - Cookie
- Laravel - 响应
- Laravel - 视图
- Laravel - Blade 模板
- Laravel - 重定向
- Laravel - 数据库操作
- Laravel - 错误与日志
- Laravel - 表单
- Laravel - 国际化
- Laravel - Session
- Laravel - 验证
- Laravel - 文件上传
- Laravel - 发送邮件
- Laravel - Ajax
- Laravel - 错误处理
- Laravel - 事件处理
- Laravel - Facades
- Laravel - Contracts
- Laravel - CSRF 保护
- Laravel - 身份验证
- Laravel - 授权
- Laravel - Artisan 命令行工具
- Laravel - 加密
- Laravel - 哈希
- 理解发布流程
- Laravel - 游客用户权限
- Laravel - Artisan 命令
- Laravel - 分页自定义
- Laravel - Dump Server
- Laravel - Action URL
- Laravel 有用资源
- Laravel - 快速指南
- Laravel - 有用资源
- Laravel - 讨论
Laravel - 控制器
在 MVC 框架中,字母“C”代表控制器 (Controller)。它充当视图 (Views) 和模型 (Models) 之间的流量导向。本章将学习 Laravel 中的控制器。
创建控制器
根据您使用的操作系统,打开命令提示符或终端,并键入以下命令以使用 Artisan CLI(命令行界面)创建控制器。
php artisan make:controller <controller-name> --plain
将 <controller-name> 替换为您控制器的名称。这将创建一个简单的构造函数,因为我们传递了参数 — **plain**。如果您不想创建简单的构造函数,可以忽略此参数。创建的构造函数可以在 **app/Http/Controllers** 中看到。
您会看到一些基本的代码已经为您编写好了,您可以添加自定义代码。创建的控制器可以通过以下语法从 routes.php 调用。
语法
Route::get(‘base URI’,’controller@method’);
示例
**步骤 1** - 执行以下命令创建 **UserController**。
php artisan make:controller UserController --plain
**步骤 2** - 成功执行后,您将收到以下输出。
**步骤 3** - 您可以在 **app/Http/Controller/UserController.php** 中看到创建的控制器,其中包含一些已为您编写的基本代码,您可以根据需要添加自己的代码。
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class UserController extends Controller { // }
控制器中间件
我们之前已经了解过中间件,它也可以与控制器一起使用。中间件也可以分配给控制器的路由或控制器内的构造函数。您可以使用 middleware 方法将中间件分配给控制器。注册的中间件也可以限制在控制器的某些方法中。
将中间件分配给路由
Route::get('profile', [ 'middleware' => 'auth', 'uses' => 'UserController@showProfile' ]);
这里我们将 auth 中间件分配给 UserController 的 profile 路由。
在控制器构造函数中分配中间件
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class UserController extends Controller { public function __construct() { $this->middleware('auth'); } }
这里我们使用 UserController 构造函数中的 middleware 方法分配 **auth** 中间件。
示例
**步骤 1** - 将以下代码添加到 **app/Http/routes.php** 文件中并保存。
routes.php
<?php Route::get('/usercontroller/path',[ 'middleware' => 'First', 'uses' => 'UserController@showPath' ]);
**步骤 2** - 通过执行以下代码行创建名为 **FirstMiddleware** 的中间件。
php artisan make:middleware FirstMiddleware
**步骤 3** - 将以下代码添加到新创建的 FirstMiddleware 的 handle 方法中,位于 **app/Http/Middleware**。
FirstMiddleware.php
<?php namespace App\Http\Middleware; use Closure; class FirstMiddleware { public function handle($request, Closure $next) { echo '<br>First Middleware'; return $next($request); } }
**步骤 4** - 通过执行以下命令创建名为 **SecondMiddleware** 的中间件。
php artisan make:middleware SecondMiddleware
**步骤 5** - 将以下代码添加到新创建的 SecondMiddleware 的 handle 方法中,位于 **app/Http/Middleware**。
SecondMiddleware.php
<?php namespace App\Http\Middleware; use Closure; class SecondMiddleware { public function handle($request, Closure $next) { echo '<br>Second Middleware'; return $next($request); } }
**步骤 6** - 通过执行以下代码行创建名为 **UserController** 的控制器。
php artisan make:controller UserController --plain
**步骤 7** - 成功执行 URL 后,您将收到以下输出 -
**步骤 8** - 将以下代码复制到 **app/Http/UserController.php** 文件。
app/Http/UserController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class UserController extends Controller { public function __construct() { $this->middleware('Second'); } public function showPath(Request $request) { $uri = $request->path(); echo '<br>URI: '.$uri; $url = $request->url(); echo '<br>'; echo 'URL: '.$url; $method = $request->method(); echo '<br>'; echo 'Method: '.$method; } }
**步骤 9** - 现在执行以下命令启动 php 的内置 Web 服务器,如果您尚未执行。
php artisan serve
**步骤 10** - 访问以下 URL。
https://127.0.0.1:8000/usercontroller/path
**步骤 11** - 输出将如下图所示。
RESTful 资源控制器
在创建应用程序时,我们经常需要执行 **CRUD(创建、读取、更新、删除)** 操作。Laravel 使这项工作变得容易。只需创建一个控制器,Laravel 将自动提供所有 CRUD 操作的方法。您还可以为 routes.php 文件中的所有方法注册单个路由。
示例
**步骤 1** - 执行以下命令创建名为 **MyController** 的控制器。
php artisan make:controller MyController
**步骤 2** - 将以下代码添加到
**app/Http/Controllers/MyController.php** 文件。
app/Http/Controllers/MyController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class MyController extends Controller { public function index() { echo 'index'; } public function create() { echo 'create'; } public function store(Request $request) { echo 'store'; } public function show($id) { echo 'show'; } public function edit($id) { echo 'edit'; } public function update(Request $request, $id) { echo 'update'; } public function destroy($id) { echo 'destroy'; } }
**步骤 3** - 将以下代码行添加到 **app/Http/routes.php** 文件。
app/Http/routes.php
Route::resource('my','MyController');
**步骤 4** - 我们现在通过使用资源注册控制器来注册 MyController 的所有方法。下表是资源控制器处理的操作。
方法 | 路径 | 动作 | 路由名称 |
---|---|---|---|
GET | /my | index | my.index |
GET | /my/create | create | my.create |
POST | /my | store | my.store |
GET | /my/{my} | show | my.show |
GET | /my/{my}/edit | edit | my.edit |
PUT/PATCH | /my/{my} | update | my.update |
DELETE | /my/{my} | destroy | my.destroy |
**步骤 5** - 尝试执行下表中显示的 URL。
URL | 描述 | 输出图片 |
---|---|---|
https://127.0.0.1:8000/my | 执行 MyController.php 的 index 方法 | index |
https://127.0.0.1:8000/my/create | 执行 MyController.php 的 create 方法 | create |
https://127.0.0.1:8000/my/1 | 执行 MyController.php 的 show 方法 | show |
https://127.0.0.1:8000/my/1/edit | 执行 MyController.php 的 edit 方法 | edit |
隐式控制器
隐式控制器允许您定义单个路由来处理控制器中的每个操作。您可以使用 **Route:controller** 方法在 route.php 文件中定义它,如下所示。
Route::controller(‘base URI’,’<class-name-of-the-controller>’);
将 <class-name-of-the-controller> 替换为您给控制器指定的类名。
控制器的方法名应以 HTTP 方法开头,例如 get 或 post。如果您以 get 开头,它将只处理 get 请求;如果您以 post 开头,它将处理 post 请求。在 HTTP 方法之后,您可以为方法命名,但它应遵循 URI 的标题大小写版本。
示例
**步骤 1** - 执行以下命令创建控制器。我们保留类名 **ImplicitController**。您可以随意为类命名。
php artisan make:controller ImplicitController --plain
**步骤 2** - 成功执行步骤 1 后,您将收到以下输出 -
**步骤 3** - 将以下代码复制到
**app/Http/Controllers/ImplicitController.php** 文件。
app/Http/Controllers/ImplicitController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class ImplicitController extends Controller { /** * Responds to requests to GET /test */ public function getIndex() { echo 'index method'; } /** * Responds to requests to GET /test/show/1 */ public function getShow($id) { echo 'show method'; } /** * Responds to requests to GET /test/admin-profile */ public function getAdminProfile() { echo 'admin profile method'; } /** * Responds to requests to POST /test/profile */ public function postProfile() { echo 'profile method'; } }
**步骤 4** - 将以下代码行添加到 **app/Http/routes.php** 文件中,以将请求路由到指定的控制器。
app/Http/routes.php
Route::controller('test','ImplicitController');
构造函数注入
Laravel 服务容器用于解析所有 Laravel 控制器。因此,您可以为控制器在其构造函数中可能需要的任何依赖项指定类型提示。这些依赖项将自动解析并注入到控制器实例中。
示例
**步骤 1** - 将以下代码添加到 **app/Http/routes.php** 文件。
app/Http/routes.php
class MyClass{ public $foo = 'bar'; } Route::get('/myclass','ImplicitController@index');
**步骤 2** - 将以下代码添加到
**app/Http/Controllers/ImplicitController.php** 文件。
app/Http/Controllers/ImplicitController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class ImplicitController extends Controller { private $myclass; public function __construct(\MyClass $myclass) { $this->myclass = $myclass; } public function index() { dd($this->myclass); } }
**步骤 3** - 访问以下 URL 来测试构造函数注入。
https://127.0.0.1:8000/myclass
**步骤 4** - 输出将如下图所示。
方法注入
除了构造函数注入外,您还可以对控制器的操作方法指定依赖项类型提示。
示例
**步骤 1** - 将以下代码添加到 **app/Http/routes.php** 文件。
app/Http/routes.php
class MyClass{ public $foo = 'bar'; } Route::get('/myclass','ImplicitController@index');
**步骤 2** - 将以下代码添加到
**app/Http/Controllers/ImplicitController.php** 文件。
app/Http/Controllers/ImplicitController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class ImplicitController extends Controller { public function index(\MyClass $myclass) { dd($myclass); } }
**步骤 3** - 访问以下 URL 来测试构造函数注入。
https://127.0.0.1:8000/myclass
这将产生以下输出 -