控制器
本篇主要讲解在Laravel框架中控制器的基本知识,主要参考中文文档中的控制器章节,并融合自己的理解。以通俗易懂的方式来解析Laravel框架中最重要的控制器知识。
1.前提知识
学习控制器之前,先来了解一下MVC概念--MVC模式简介。MVC是三个单词的缩写,
1)View: 最上面的一层,是直接面向最终用户的"视图层"。它是提供给用户的操作界面,是程序的外壳。
2)Model: 底下的一层,是核心的"数据层",也就是程序需要操作的数据或信息。
3)Controller: 中间的一层,就是"控制层",它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。
在Laravel框架中,View层代码放在\resources\views目录中,文件扩展名.blade.php,Blade 是 Laravel 提供的一个简单而又强大的模板引擎。在Blade模板里可以使用原生 PHP 代码。所有 Blade 视图文件都将被编译成原生的 PHP 代码并缓存起来,除非它被修改,否则不会重新编译,这就意味着 Blade 基本上不会给你的应用增加任何负担。Model通常在 app 目录中,但你可以根据 composer.json 文件将他们放置在可以被自动加载的任意位置。Laravel 的 Eloquent ORM 提供了一个漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。你可以通过模型查询数据表中的数据,以及在数据表中插入新记录。Controller被存放在app/Http/Controllers目录中,将相关的请求处理逻辑组成一个个单独的类,来处理模型中的数据,并将数据处理的结果发送给视图层。
2.控制器的学习
①基础控制器
1>定义控制器
下面是一个基础控制器类的例子。 需要注意的是,该控制器继承了 Laravel 内置的基类控制器。该基类控制器提供了一些便利的方法,比如 middleware 方法,该方法可以为控制器行为添加中间件:
<?php
namespace App\Http\Controllers;
use App\User;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 显示给定用户的概要文件.
*
* @param int $id
* @return View
*/
public function show($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
你可以这样定义一个指向控制器行为的路由:
Route::get('user/{id}', 'UserController@show');
现在,当一个请求与指定路由的 URI 匹配时, UserController 控制器中的 show 方法就会被执行。路由参数也将会被传递给该方法。
Tip:控制器并 不是强制要求继承基础类 。 但是, 如果控制器没有继承基础类,你将无法使用一些便捷的功能,比如 middleware, validate 和 dispatch 方法。
2>控制器 & 命名空间
需要着重指出的是,在定义控制器路由时我们不需要指定完整的控制器命名空间。因为 RouteServiceProvider 会在一个包含命名空间的路由组中加载路由文件,我们只需要指定类名中 App\Http\Controllers 命名空间之后的部分就可以了。
如果你选择将控制器放在 App\Http\Controllers 更深层次的目录中,需要使用相对于 App\Http\Controllers 作为根命名空间的指定类名。 因此,如果你完整的控制器类名为 App\Http\Controllers\Photos\AdminController,你在路由中应当采用如下的形式注册:
Route::get('foo', 'Photos\AdminController@method');
3>单个行为控制器
如果你想定义一个只处理单个行为的控制器,你可以在控制器中放置一个 __invoke 方法:
<?php
namespace App\Http\Controllers;
use App\User;
use App\Http\Controllers\Controller;
class ShowProfile extends Controller
{
/**
* 展示给定用户的资料.
*
* @param int $id
* @return View
*/
public function __invoke($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
当注册单个行为控制器的路由时,无需指明方法:
Route::get('user/{id}', 'ShowProfile');
你可以通过 Artisan 命令工具里的 make:controller 命令中的 --invokable 选项来生成一个可调用的控制器:
php artisan make:controller ShowProfile --invokable
②控制器中间件
Middleware 可以在路由文件中分配给控制器的路由。
Route::get('profile', 'UserController@show')->middleware('auth');
但是,在控制器的构造函数中指定中间件更为方便。使用控制器构造函数中的 middleware 方法,可以轻松地将中间件分配给控制器的操作。你甚至可以将中间件限制为控制器类上的某些方法。
class UserController extends Controller
{
/**
* Instantiate a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('log')->only('index');
$this->middleware('subscribed')->except('store');
}
}
同时,控制器还允许您使用一个闭包注册中间件。这为不定义整个中间件类的情况下为单个控制器定义中间件提供了一种方便的方法:
$this->middleware(function ($request, $next) {
// ...
return $next($request);
});
Tip:你可以将中间件分配给控制器操作的一个子集;但是,它可能表明你的控制器正在变得很大。建议你将控制器拆分为多个较小的控制器。
----未完待续----
本文由博客群发一文多发等运营工具平台 OpenWrite 发布
网友评论