HTTP 控制器

未匹配的标注
本文档最新版为 6.x,旧版本可能放弃维护,推荐阅读最新版!

HTTP 控制器

简介

你可能希望使用一些控制器类来组织这种行为,而不是在单 routes.php 文件中定义所有的请求处理逻辑。 控制器可以将相关的 HTTP 请求处理逻辑组成到一个类中。 我们一般把控制器存放在 app/Http/Controllers 目录中。

基础控制器

这是一个基础控制器类的例子。所有 Lumen 控制器都应继承基础控制器类,它被包含在 Lumen 的默认安装中:

<?php

namespace App\Http\Controllers;

use App\User;

class UserController extends Controller
{
    /**
     * 显示指定ID的用户数据.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        return User::findOrFail($id);
    }
}

我们可以通过路由来指定控制器行为,就像下面这样:

$router->get('user/{id}', 'UserController@show');

现在,当请求与指定的路由 URI 相匹配时,UserController 类中的 show方法将被执行。 当然,路由参数也将传递给该方法。

控制器和命名空间

有一点非常重要,那就是我们要注意在定义控制器路由时,不需要指定完整的控制器命名空间。我们只需定义「根」命名空间 App\Http\Controllers 之后的类名部分。默认情况下,bootstrap/app.php 文件在加载 routes.php 时已经把所有路由规则都配置了根控制器命名空间。

如果你选择在 App\Http\Controllers 目录内层使用 PHP 命名空间嵌套或组织控制器,只要使用相对于 App\Http\Controllers 根命名空间的特定类名称即可。因此,如果你的控制器类全名是 App\Http\Controllers\Photos\AdminController,那么你应该注册一个路由,如下所示:

$router->get('foo', 'Photos\AdminController@method');

命名控制器路由

像闭包路由那样,你可以给控制器路由指定一个名称:

$router->get('foo', ['uses' => 'FooController@method', 'as' => 'name']);

你也可以使用 route 辅助函数,来生成指向控制器路由的 URL:

$url = route('name');

控制器中间件

中间件可以分配给指定的控制器路由,如下所示:

$router->get('profile', [
    'middleware' => 'auth',
    'uses' => 'UserController@showProfile'
]);

不过,在控制器构造器中指定中间件会更为灵活。在控制器构造器中使用 middleware 方法,你可以很容易地将中间件指定给控制器。你甚至可以对中间件作出限制,仅将它提供给控制器类中的某些方法。

class UserController extends Controller
{
    /**
     * 实例化一个新的UserController实例.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');

        $this->middleware('log', ['only' => [
            'fooAction',
            'barAction',
        ]]);

        $this->middleware('subscribed', ['except' => [
            'fooAction',
            'barAction',
        ]]);
    }
}

依赖注入 & 控制器

构造器注入

Lumen 使用 服务容器 来解析所有控制器的依赖注入。 因此, 你可以在控制器的构造函数中使用类型提示需要的任何依赖。这些依赖将会被自动解析并注入到控制器实例中:

<?php

namespace App\Http\Controllers;

use App\Repositories\UserRepository;

class UserController extends Controller
{
    /**
     * 用户存储实例。
     */
    protected $users;

    /**
     * 创建一个控制器实例
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }
}

方法注入

除了构造方法注入外, 也可以在控制器的方法中使用类型提示依赖项。例如:在函数中添加 Illuminate\Http\Request 实例的类型提示:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * 储存一个新用户。
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        $name = $request->input('name');

        //
    }
}

如果你的控制器方法也希望接收来自路由的参数,只需简单地在其他依赖后列出路由参数即可。例如:如果你是这样定义路由:

$router->put('user/{id}', 'UserController@update');

你仍可以添加 Illuminate\Http\Request 实例的类型提示,并通过像如下代码片段中定义控制器方法以此来获取路由参数 id

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * 更新指定用户。
     *
     * @param  Request  $request
     * @param  string  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/lumen/5.5/http-...

译文地址:https://learnku.com/docs/lumen/5.5/http-...

上一篇 下一篇
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
贡献者:6
讨论数量: 0
发起讨论 只看当前版本


暂无话题~