HTTP 控制器

更新时间: 2019-08-01 16:47

简介

为了替代把所有的请求处理逻辑都定义在 routes.php 路由文件中,你或许想要使用控制来组织这些行为。控制器可以把相关的请求处理逻辑整合为一个控制器类。控制器类文件被存储在 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)
    {
        //
    }
}

查看更多 Laravel 中文文档 信息

与机器赛跑

与机器赛跑

[美]埃里克·布林约尔松(Erik Brynjolfsson)、[美]安德鲁·麦卡菲(Andrew McAfee) / 闾佳 / 2013-1-20 / 6.00

一场数字革命正在加速进行。 一些科幻小说里的场景已经在现实中发生:无人驾驶汽车开上了公路;智能设备能高效地翻译人类语言;人工智能系统在智力竞赛里击败了所有人类选手;工厂雇主开始购买更多的新机器,却不招新工人…… 这些例子都证明,数字技术正在快速地掌握原本只属于人类的技能,并深刻地影响了经济。虽然大多数影响是积极的:数字革新将提高效率、降低商品价格(甚至到免费),以及增加经济总量。 ......一起来看看 《与机器赛跑》 这本书的介绍吧!

随机密码生成器

随机密码生成器

多种字符组合密码

SHA 加密

SHA 加密

SHA 加密工具

HEX HSV 转换工具

HEX HSV 转换工具

HEX HSV 互换工具