Thinkphp快速入门(三)

文章目录

        • 中间件
          • 中间件创建
          • 全局中间件
          • 应用中间件
          • 路由中间件
          • 控制器中间件
        • 视图
          • 引入视图组件
          • 渲染视图
          • 模版传参
          • viwe 辅助函数

中间件

在执行主要逻辑之前进行某些操作或之后进行某些操作
常用来登录验证,csrf验证等

中间件创建
        # 中间件可以通过 php think make:middleware  创建
        # 不过这是创建在 app/middleware 下的
        php think make:middleware stop
        # 如果想写在应用目录下的middleware目录中(如:app/admin/middleware 下)
        # 可以自己声明一个类
        # 只要有 public function handle($request, \Closure $next) 即可
        # 你会发现中间类是没有继承和实现某个接口的
        # 有点类似 python,goLang的 Duck Typing
全局中间件

写在根目录的middleware.php中
对全局有效
app/middleware.php

// 全局中间件定义文件
return [
    // 全局请求缓存
    // \think\middleware\CheckRequestCache::class,
    // 多语言加载
    // \think\middleware\LoadLangPack::class,
    // Session初始化
//     \think\middleware\SessionInit::class
];

应用中间件

写在应用的middleware.php中
对当前应用有效
app/admin/middleware.php

return [
    \think\middleware\SessionInit::class
];
路由中间件

写在路由文件中
针对指定的路由有效

use think\facade\Route;

# 针对一条路由使用中间件
Route::any('test', 'base.home/test')->middleware(\app\middleware\stop::class);

# 以组的形式针对多条路由使用中间件
Route::group(function () {
    Route::any('home', 'base.home/index');
    Route::any('look', 'base.home/look');
})->middleware(\app\middleware\stop::class);
控制器中间件

namespace app\admin\controller\base;

use app\BaseController;
use app\middleware\stop;
use app\Request;
use think\App;

class Home extends BaseController
{
    public function initialize()
    {
        # 当前控制器所有方法都使用中间件
        # $this->middleware = [stop::class];

        # 当前控制器除了index方法不使用中间件,其余方法都使用
        # $this->middleware = [stop::class => ['except' => 'index']];

        # 只给当前控制器index方法使用中间件
        $this->middleware = [stop::class => ['only' => 'index']];
    }

    public function index()
    {
        return captcha('verify');
    }

    public function test(Request $request)
    {
        return json(['name' => 'name'], 200, ['content-type' => 'text/json']);
    }

}
视图
引入视图组件
composer require topthink/think-view
渲染视图
namespace app\admin\controller\base;

use app\BaseController;
use think\App;
use think\facade\View;

class Home extends BaseController
{

    public function index()
    {
        # 模版的默认后缀是html,这里为php(我修改config/view.php 中 'view_suffix' => 'php')
        # /index 中的 "/" 代表 从当前应用目录下view中加载模板(app/admin/view/index.php)
        # 如果只写 index 代表从 根目录下的view中加载模板
        # 且加载文件层级 为 app/view/应用名/控制器层级/index(app/view/admin/base/home/index.php)
        return View::fetch('index');
    }
    
}

使用绝对路径渲染模版

namespace app\admin\controller\base;

use app\BaseController;
use think\App;
use think\facade\View;

class Home extends BaseController
{

    public function index()
    {
        # 如果想在admin应用渲染 根目录view/common/index.php 模版
        # 可以通过绝对目录解决这个问题
        return View::fetch(rtrim(root_path('view/common/index.php'), '/'));
    }

}
模版传参
namespace app\admin\controller\base;

use app\BaseController;
use think\App;
use think\facade\View;

class Home extends BaseController
{

    public function index()
    {
        # view::fetch($template,$vars)
        # $vars array 给模版传参
        # 模版中通过 {$name}...等可以渲染该参数值
        return View::fetch('/index', ['name' => 'this is name']);
    }

}
viwe 辅助函数

view辅助函数是在对View 视图的封装
提供了常用的参数设置
view(string $template = ‘’, $vars = [], $code = 200, $filter = null)
$template 模版地址 同 View::fetch() 中的模版地址用法相同
$vars 模版传参 同 View::fetch() 中的模版传参相同
$code 设置响应状态码
$filter 闭包函数,对最后输出的内容进行处理

namespace app\admin\controller\base;

use app\BaseController;
use think\App;

class Home extends BaseController
{

    public function index()
    {
        # content 是渲染完后的模版内容
        # 最后输出的是 “a” + 渲染的后的模板内容 + "b"
        return view('/index', ['name' => 'this is name'], 200, function ($content) {
            return "a" . $content . "b";
        });
    }

}

你可能感兴趣的:(PHP,#,Thinkphp,php,thinkphp)