Lumen 5.2 HTTP 控制器入门教程

1、简介

将所有的请求处理逻辑都放在单个routes.php中肯定是不合理的,你也许还希望使用控制器类组织管理这些行为。控制器可以将相关的HTTP请求封装到一个类中进行处理。通常控制器存放在app/Http/Controllers目录中。

2、基本控制器

下面是一个基本控制器类的例子。所有的Lumen控制器应该继承自Lumen安装默认的基本控制器:

<?php

namespace App\Http\Controllers;

use App\User;

class UserController extends Controller
{
    /**
     * 为指定用户显示详情
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        return User::findOrFail($id);
    }
}

我们可以像这样路由到控制器动作:

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

现在,如果一个请求匹配指定的路由URI,UserController的show方法就会被执行。当然,路由参数也会被传递给这个方法。

2.1 控制器&命名空间

你应该注意到我们在定义控制器路由的时候没有指定完整的控制器命名空间,我们只需要定义App\Http\Controllers之后的类名部分。默认情况下,bootstrap/app.php将会在一个路由分组中载入routes.php文件,该路由分组包含了控制器的根命名空间。

如果你在App\Http\Controllers目录下选择使用PHP命名空间嵌套或组织控制器,只需要使用相对于App\Http\Controllers根命名空间的指定类名即可。因此,如果你的完整控制器类是App\Http\Controllers\Photos\AdminController,你可以像这样注册路由:

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

2.2 命名控制器路由

和闭包路由一样,可以指定控制器路由的名字:

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

你还可以使用辅助函数route来为已命名的控制器路由生成URL:

$url = route('name');

3、控制器中间件

中间件可以像这样分配给控制器路由:

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

但是,将中间件放在控制器构造函数中更方便,在控制器的构造函数中使用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']]);
    }
}

4、依赖注入&控制器

4.1 构造函数注入

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

<?php

namespace App\Http\Controllers;

use Illuminate\Routing\Controller;
use App\Repositories\UserRepository;

class UserController extends Controller
{
    /**
     * The user repository instance.
     */
    protected $users;

    /**
     * 创建新的控制器实例
     *
     * @param  UserRepository  $users
     * @return void
     * @translator http://www.111cn.net
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }
}
当然,你还可以类型提示任何Laravel契约,如果容器可以解析,就可以进行类型提示。

4.2 方法注入

除了构造函数注入之外,还可以在控制器的动作方法中进行依赖的类型提示,例如,我们可以在某个方法中类型提示Illuminate\Http\Request实例:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

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

        //
    }
}

如果控制器方法期望输入路由参数,只需要将路由参数放到其他依赖之后,例如,如果你的路由定义如下:

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

你需要通过定义控制器方法如下所示来类型提示Illuminate\Http\Request并获取路由参数id:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class UserController extends Controller
{
    /**
     * 更新指定用户
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     * @translator http://www.111cn.net
     */
    public function update(Request $request, $id)
    {
        //
    }
}

时间: 2024-11-08 20:18:16

Lumen 5.2 HTTP 控制器入门教程的相关文章

Lumen 5.2 HTTP 路由入门教程

1.基本路由 所有路由都定义在app/Http/routes.php中.最基本的 Lumen 路由接收一个 URI 和一个闭包: $app->get('foo', function () {     return 'Hello World'; }); $app->post('foo', function () {     // }); 有效的路由方法 路由器允许你注册响应任何HTTP动作的路由: $app->get($uri, $callback); $app->post($uri

Phalcon入门教程之控制器

原文发表于:Phalcon入门教程之控制器 控制器在MVC分层中的主要作用是处理请求与响应.Phalcon中的控制器类必须以" Controller "为后缀,action则以" Action "为后缀. " Phalcon\Mvc\Controller "是Phalcon中控制器的基类,我们写的控制器类通过继承此基类,可以调用在DI中注册的各种服务.一个简单的控制器类示例如下: namespace Marser\App\Frontend\Con

AngularJS入门教程之控制器详解_AngularJS

AngularJS 控制器 AngularJS 控制器 控制 AngularJS 应用程序的数据.  AngularJS 控制器是常规的 JavaScript 对象. AngularJS 控制器 AngularJS 应用程序被控制器控制. ng-controller 指令定义了应用程序控制器. 控制器是 JavaScript 对象,由标准的 JavaScript 对象的构造函数 创建. AngularJS 实例 <!DOCTYPE html> <html> <head>

ASP.NET MVC 5 入门教程 (2) 控制器Controller

原文:ASP.NET MVC 5 入门教程 (2) 控制器Controller 文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-get-started-controller.html 上一节:ASP.NET MVC 5 入门教程 (1) 新建项目 下一节:ASP.NET MVC 5 入门教程 (3) 路由route 源码下载:点我下载 顾名思义,一个MVC项目是由M-Model-模型.V-View-视图.C-Controller-

高性能PHP框架Symfony2中文入门教程

最近,出于对Symfony2的关注,在网上闲逛时不时会留意Symfony2的文章,尤其是中文方面的.前段时间拜读了一饼兄的<Symfony2入门>一文,觉得比官网上的例子涉及面更广便做了转载.今日有暇细读,却发现一饼兄只是大体对Symfony2做了介绍,如果参照该文来入门的话,却是存在很大的问题,于是便有了这一篇文章. 下载 首先是下载Symfony2,这个简单,到 http://symfony.com/download或者本站下载.本人由于使用的是Ubuntu系统,所以下了个.tgz的,然后

ReactiveCocoa入门教程:第二部分

翻译自:http://www.raywenderlich.com/62796/reactivecocoa-tutorial-pt2 原文链接: ReactiveCocoa 是一个框架,它允许你在你的iOS程序中使用函数响应式(FRP)技术.加上第一部分的讲解,你将会学会如何使用信号量(对事件发出数据流)如何替代标准的动作和事件处理逻辑.你也会学到如何转换.分离和组合这些信号量. 在这里,也就是第二部分里,你将会学到更多先进的ReactiveCocoa特性,包括: 1.另外两个事件类型:error

Yii2框架制作RESTful风格的API快速入门教程_php实例

先给大家说下什么是REST restful REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一. 他在论文中提到:"我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强.性能好.适宜通信的架构.REST指的是一组架构约束条件和原则." 如

ASP.NET MVC 5 入门教程 (4) View和ViewBag

原文:ASP.NET MVC 5 入门教程 (4) View和ViewBag 文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-get-started-view.html 上一节:ASP.NET MVC 5 入门教程 (3) 路由Route 下一节:ASP.NET MVC5 + EF6 入门教程 (5) Model和Entity Framework 源码下载:点我下载 View(视图)用来显示被controller处理好的数据.本节

AngularJS入门教程之更多模板详解_AngularJS

在这一步,你将实现手机详细信息视图,这个视图会在用户点击手机列表中的一部手机时被显示出来. 请重置工作目录: git checkout -f step-8 现在当你点击列表中的一部手机之后,这部手机的详细信息页面就会被显示出来. 为了实现手机详细信息视图我们将会使用$http来获取数据,同时我们也要增添一个phone-detail.html视图模板. 步骤7和步骤8之间最重要的不同在下面列出.你可以在GitHub里看到完整的差别. 数据 除了phones.json,app/phones/目录也包