Laravel - 控制器
在 MVC 框架中,字母 C 代表 Controller。它充当 Views 和 Models 之间的交通指挥者。本章中,您将学习 Laravel 中的 Controllers。
创建 Controller
打开您使用的操作系统的命令提示符或终端,并输入以下命令,使用 Artisan CLI(命令行界面)创建 controller。
php artisan make:controller <controller-name> --plain
将 <controller-name> 替换为您的 controller 名称。这将创建一个 plain constructor,因为我们传递了 plain 参数。如果您不想创建 plain constructor,可以忽略该参数。创建的 constructor 可以位于 app/Http/Controllers 中查看。
您会看到一些基本的代码已经为您编写好,您可以添加自定义代码。从 routes.php 中可以通过以下语法调用创建的 controller。
语法
Route::get(base URI,controller@method);
示例
步骤 1 − 执行以下命令创建 UserController。
php artisan make:controller UserController --plain
步骤 2 − 成功执行后,您将收到以下输出。
步骤 3 − 您可以在 app/Http/Controllers/UserController.php 中看到创建的 controller,其中已经编写了一些基本代码,您可以根据需要添加自己的代码。
<?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 中间件分配到 profile 路由中的 UserController。
在控制器的构造函数中分配中间件
<?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>第一个中间件';
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>第二个中间件';
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。
http://localhost:8000/usercontroller/path
步骤 11 − 输出将如下图所示。

Restful 资源控制器
在开发应用程序时,我们经常需要执行 CRUD (Create, Read, Update, Delete) 操作。Laravel 让这项工作变得非常简单。只需创建一个 controller,Laravel 就会自动提供所有 CRUD 操作的方法。你也可以在 routes.php 文件中为所有方法注册一条单一的 route。
示例
步骤 1 − 通过执行以下命令创建一个名为 MyController 的 controller。
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 − 我们现在通过注册带有 resource 的 controller 来注册 MyController 的所有方法。下面是 resource controller 处理的操作表。
| 动词 | 路径 | 操作 | Route 名称 |
|---|---|---|---|
| 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 | 描述 | 输出图像 |
|---|---|---|
| http://localhost:8000/my | 执行 MyController.php 的 index 方法 | index |
| http://localhost:8000/my/create | 执行 MyController.php 的 create 方法 | create |
| http://localhost:8000/my/1 | 执行 MyController.php 的 show 方法 | show |
| http://localhost:8000/my/1/edit | 执行 MyController.php 的 edit 方法 | edit |
隐式控制器
隐式控制器允许您定义单个路由来处理控制器中的每个操作。您可以在 routes.php 文件中使用 Route::controller 方法来定义它,如下所示。
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 {
/**
* 响应对 GET /test 的请求
*/
public function getIndex() {
echo 'index method';
}
/**
* 响应对 GET /test/show/1 的请求
*/
public function getShow($id) {
echo 'show method';
}
/**
* 响应对 GET /test/admin-profile 的请求
*/
public function getAdminProfile() {
echo 'admin profile method';
}
/**
* 响应对 POST /test/profile 的请求
*/
public function postProfile() {
echo 'profile method';
}
}
步骤 4 − 在 app/Http/routes.php 文件中添加以下行,以将请求路由到指定的控制器。
app/Http/routes.php
Route::controller('test','ImplicitController');
构造函数注入
Laravel 服务容器用于解析所有 Laravel 控制器。因此,您可以在控制器的构造函数中 type-hint 任何控制器可能需要的依赖项。这些依赖项将自动解析并注入到控制器实例中。
示例
步骤 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 测试构造函数注入。
http://localhost: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 来测试方法注入。
http://localhost:8000/myclass
它将产生以下输出 −
