控制器

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基础控制器,如果继承了该基础控制器,那么可以直接使用apprequest属性

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);
    }
}
powered by GitbookEdit Time: 2023-04-08 10:28:32