Laravel 控制器:从 MVC 模式到资源控制器

Posted by

控制器的概述

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

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

控制器入门

通过 Artisan 命令快速创建一个控制器:

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

 php artisan make:controller TaskController
Controller created successfully.

默认生成的控制器代码如下:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TaskController extends Controller
{
    //
}

然后我们来定义一个指向该控制器动作的路由:

Route::get('/task', 'TaskController@home');

这样,我们访问 /task 就能看到「Hello, World!」了。

开发中常见的控制器方法代码如下:

public function index()
{
    return view('task.index')
        ->with('tasks', Task::all());
}

这段代码的含义是通过 Task::all() 查询所有任务数据,并将其赋值给 tasks 变量在视图 task.index (resources/views/task/index.blade.php)中渲染出来。