控制器
ThinkPHP 的控制器定义比较灵活,可以无需继承任何的基础类,也或者根据业务需求封装自己的基础控制器类。
控制器定义
控制器文件通常放在controller
下面,类名和文件名保持大小写一致,并采用驼峰命名(首字母大写)
如果要改变controller
目录名,需要在route.php
配置文件中设置
'controller_layer' => 'controllers',
单应用模式
<?php
namespace app\controller;
class User
{
public function login()
{
return '这是User控制器的login方法';
}
}
访问URL地址是(假设没有定义路由的情况下)
<!-- 文件位置 -->
app\controller\User.php
<!-- 域名/控制器/方法 -->
http://www.tp.com/user/login
<!-- 会在浏览器输出 -->
这是User控制器的login方法
多应用模式
多应用模式下,控制器类定义仅仅是命名空间有所区别
<?php
namespace app\index\controller;
class User
{
public function login()
{
return '这是User控制器的login方法';
}
}
访问URL地址是(假设没有定义路由的情况下)
<!-- 文件位置 -->
app\index\controller\User.php
<!-- 域名/应用/控制器/方法 -->
http://www.tp.com/index/user/login
<!-- 会在浏览器输出 -->
这是User控制器的login方法
多级控制器
<?php
namespace app\index\controller\user;
class Base
{
public function index()
{
return 'index';
}
}
访问URL地址是(假设没有定义路由的情况下)
<!-- 文件位置 -->
app/index/controller/user/Base.php
<!-- 域名/ -->
http://www.tp.com/index/user.blog/index
<!-- 会在浏览器输出 -->
index
由于URL访问不能访问默认的多级控制器,建议多级控制器都通过定义路由后访问
Route::get('user/base','user.base/index');
基础控制器
ThinkPHP提供了一个BaseController
基础控制器,如果继承了该基础控制器,那么可以直接使用app
和request
属性
namespace app\index\controller\user;
use app\BaseController;
class Base extends BaseController
{
public function index()
{
$action = $this->request->action();
$path = $this->app->getBasePath();
}
}
空控制器
空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位当前应用下的空控制器Error
类,利用这个机制我们可以用来定制错误页面和进行URL的优化
<?php
namespace app\index\controller;
class Error
{
public function __call($method, $args)
{
return 'error request!';
}
}
控制器中间件
支持为控制器定义中间件,你只需要在你的控制器中定义middleware属性
<?php
namespace app\index\controller\User;
use app\BaseController;
use app\index\middleware\Auth;
use think\Request;
class Base extends BaseController
{
protected $middleware = [
// 除了index方法不走中间件,其他方法都走
Auth::class => ['except' => ['index']]
];
public function index()
{
return 'index方法';
}
public function hello()
{
return 'hello';
}
}
中间件
由于文档使用的是多应用模式,配置文件:app\index\middleware\Auth.php
<?php
namespace app\index\middleware;
class Auth
{
/**
* 处理请求
*
* @param \think\Request $request
* @param \Closure $next
* @return Response
*/
public function handle($request, \Closure $next)
{
if(empty(session('LoginUser')))
{
// 如果条件成立,则重定向回首页
return redirect((string)url('/'));
}
// 返回Request对象
return $next($request);
}
}