Laravel 控制器:从 MVC 模式到资源控制器
控制器的概述
路由都是基于闭包函数实现的,在 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
)中渲染出来。