Laravel 入门(2)控制器

控制器概述

在 MVC 模式中,M 代表模型(Model),V 代表视图(View),C 代表控制器(Controller),控制器负责组织路由和业务逻辑(当然,对于更加复杂的业务逻辑还会引入 Service 层),模型类负责底层数据存取与处理,而视图层负责数据渲染与页面交互。对于一些 CRUD 操作(数据库增删改查操作的简写)来说,常见的业务逻辑也就是从模型类获取数据并将其渲染到页面,或者从页面获取用户提交数据并将其存储到模型类。

将所有业务逻辑一股脑放到控制器听起来挺不错,但是控制器更适合承担的角色其实是负责对 HTTP 请求进行路由,因为还有很多其他访问应用的方式,比如 Artisan 命令、队列、调度任务等等,控制器并非唯一入口,所以不适合也不应该将所有业务逻辑封装于此,过度依赖控制器会对以后应用的扩展带来麻烦。所以,你应该具备这样的意识:控制器的主要职责就是获取 HTTP 请求,进行一些简单处理(如验证)后将其传递给真正处理业务逻辑的职能部门,如 Service。

注:当然,如果是非常简单的应用,比如只是简单的数据库增删改查或数据渲染,放到控制器里面也无妨,但是如果后续需要调用控制器方法才能完成某个功能,那么是时候将这个控制器方法里的业务逻辑拆分到 Service 里面了。

控制器入门

我们可以通过 Artisan 命令快速创建一个控制器:

php artisan make:controller TaskController

该命令会在 app/Http/Controllers 目录下创建一个新的名为 TaskController.php 的文件

获取用户输入

public function store(Request $request)
{
    $task = new Task();
    $task->title = $request->input('title');
    $task->description = $request->input('description');
    $task->save();
    return redirect('task');   // 重定向到 GET task 路由
}

我们通过 $request 对象来获取用户输入,此外还可以通过 Input 门面 获取用户输入:

$task->title = Input::get('title');

注:使用这种方式需要引入 Input 门面:use Illuminate\Support\facades\Input

门面仅仅是静态代理,底层调用的还是 $request->input 方法,语法糖而已,建议大家还是用 $request 来获取。

使用上述获取方式可以获取用户提供的任何输入数据,不管是查询字符串还是表单字段。

依赖注入

正如前面介绍的 Input 门面一样,Laravel 中的门面为 Laravel 代码库中的大部分类提供了简单的接口调用,通过门面你可以轻松从当前获取各种请求数据,比如用户输入、Session、Cookie 等,但不是所有的类都有对应的门面(当前的映射关系可以查看门面列表),对于这些类提供的方法我们可以通过更底层的依赖注入来调用,本质上来看,门面仅仅是一种设计模式,是对底层复杂 API 的上层静态代理,主要目的在于简化代码调用,所以可以用门面调用的方法肯定可以用依赖注入来实现,而可以通过依赖注入实现的功能不一定可以通过门面来调用,除非你自定义实现这个门面。

提到依赖注入,就绕不开服务容器,关于服务容器后面我们会单独讲解,而现在你只需了解服务容器是一个绑定多个接口与具体服务实现类的容器,而依赖注入则是在代码编写时以接口(或者叫做类型提示)方式作为参数,不必传入具体实现类,在代码运行时会根据配置从服务容器获取接口对应的实现类执行具体的接口方法,从而极大提高了代码的可维护性和可扩展性。

在 Laravel 中所有的控制器方法(包括构造函数)都会在服务容器中进行解析,这意味着所有方法中传入的可以被容器解析的接口/类型提示对应服务实现都会被自动注入,我们将这个过程称之为依赖注入。我们上面演示的通过 $request 对象获取用户请求数据就是采用依赖注入的方式。

在日常开发中,推荐大家使用依赖注入而非门面来获取用户输入数据,除此之外,还可以通过 $request 对象获取 Session、Cookie 数据。

资源控制器

有时候在编写控制器时命名方法名称可能是最困难的,好在 Laravel 为常见的 REST/CRUD 控制器(在 Laravel 中称之为「资源控制器」)提供了一套约定规则,并为此提供了相应的 Artisan 生成器和路由定义方法,从方便我们一次为所有控制器方法定义路由。

首先,我们使用这个 Artisan 生成器来生成一个资源控制器(在之前命名后加上 --resource 选项):

php artisan make:controller PostController --resource

资源控制器方法列表

以上 PostController 控制器的每个方法都有对应的请求方式、路由命名、URL、方法名和业务逻辑约定。

HTTP请求方式 URL 控制器方法 路由命名 业务逻辑描述
GET post index() post.index 展示所有文章
GET post/create create() post.create
POST post store() post.store
GET post/ show() post.show
GET post/{id}/edit edit() post.edit
PUT post/ update() post.update
DELETE post/ destroy() post.desc

绑定资源服务器

通过上面的表格已经了解了 Laravel 中对资源路由的命名约定,Laravel 还为我们提供了一个 Route::resource 方法用于一次注册包含上面列出的所有路由,并且遵循上述所有约定:

Route::resource('post', 'PostController');

你可以通过 Artisan 命令 php artisan route:list 查看应用的所有路由

posted @ 2020-09-02 00:37  caibaotimes  阅读(122)  评论(0)    收藏  举报