tp 5 控制器

控制器

5.0的控制器类比较灵活,可以无需继承任何基础类库。控制器不应该过多的介入业务逻辑处理
控制器就是一个类,类里的不同的方法就是不同的操作

定义

可以继承控制器基类 不继承也可以完成相关功能

<?php
namespace app\controller;
use think\facade\Env;
use think\Controller;//命名空间也可以导入

class Index extends Controller
{
    public function hello()
    {
        return '<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:) </h1><p> ThinkPHP V5.1<br/><span style="font-size:30px">12载初心不改(2006-2018) - 你值得信赖的PHP框架</span></p></div><script type="text/javascript" src="https://tajs.qq.com/stats?sId=64890268" charset="UTF-8"></script><script type="text/javascript" src="https://e.topthink.com/Public/static/client.js"></script><think id="eab4b9f840753f8e7"></think>';
    }

    public function index()
    {
        return '环境变量' . Env::get('app_path');
    }
}

双单词命名时不能双大写 url访问时为 hello_world

想原样访问可以关闭设置

    // 是否自动转换URL中的控制器和操作名
    'url_convert'            => false,

修改根命名空间

修改app根目录空间名

渲染输出

return

json函数

view输出模板

默认输出格式为html,可以更改配置文件

    // 默认输出类型
    'default_return_type'    => 'html',
    // 默认AJAX 数据返回格式,可选json xml ...
    'default_ajax_return'    => 'json',
<?php
namespace app\controller;

class HelloWorld{
    public function index(){
        echo "Hello World\n";
        $data = array(
            'name' => 'ThinkPHP',
            'version' => '5.1'
        );
        return json($data);
        
    }
    public function test(){
        return view('');
    }
}

http://localhost/tp5/tp5/public/index.php/hello_world/test

模板文件不存在:F:\web\phpStudy_64\phpstudy_pro\WWW\tp5\tp5\application\view\hello_world\test.html

根据报错创建模板

目录名有说法

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>HelloWorld</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 20px;
            background-color: #f5f5f5;
        }
        .container {
            max-width: 800px;
            margin: 0 auto;
            background-color: white;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        }
        h1 {
            color: #333;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Hello World</h1>
        <p>欢迎来到 ThinkPHP 5</p>
    </div>
</body>
</html>

继承

如果继承了基类控制器,可以定义控制器的初始化方法

    // 初始化
    protected function initialize()
    {}

会在调用控制器方法之前执行 不需要任何返回值,输出用php方式 return无效

重写一下

<?php
namespace app\controller;
use think\facade\Env;
use think\Controller;

class Index extends Controller
{
    
    public function hello()
    {
        return '<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:) </h1><p> ThinkPHP V5.1<br/><span style="font-size:30px">12载初心不改(2006-2018) - 你值得信赖的PHP框架</span></p></div><script type="text/javascript" src="https://tajs.qq.com/stats?sId=64890268" charset="UTF-8"></script><script type="text/javascript" src="https://e.topthink.com/Public/static/client.js"></script><think id="eab4b9f840753f8e7"></think>';
    }

    public function index()
    {
        return '环境变量' . Env::get('app_path');
    }
    protected function initialize(){
        parent::initialize();
        echo "初始化方法\n";
    }
}

控制器操作

前置操作

需要继承controller类,继承后可以设置一个$beforeActionList属性创建前置方法

<?php

namespace app\controller;

use think\Controller;

  

class Before extends Controller

{

    // 前置操作配置(规则不变)

    protected $beforeActionList = [

        'first',          // 所有方法都会执行first

        'second' => ['except' => 'one'],  // 注意:你写的expect是笔误,正确是except(排除)

        'third' => ['only' => 'one,two'], // 只在one、two方法执行third

    ];
?>

可选择

<?php

namespace app\controller;

use think\Controller;

  

class Before extends Controller

{

    // 前置操作配置(规则不变)

    protected $beforeActionList = [

        'first',          // 所有方法都会执行first

        'second' => ['except' => 'one'],  // 注意:你写的expect是笔误,正确是except(排除)

        'third' => ['only' => 'one,two'], // 只在one、two方法执行third

    ];

  

    // 前置方法:把return改成echo,避免终止流程

    protected function first()

    {

        echo 'f11 '; // 用echo输出,不会终止后续执行

    }

  

    protected function second()

    {

        echo 'f22 ';

    }

  

    protected function third()

    {

        echo 'f33 ';

    }

  

    public function one()

    {

        echo 'f1';

    }

  

    public function two()

    {

        echo 'f2';

    }

  

    // 修正拼写错误:thire → three

    public function three()

    {

        echo 'f3';

    }

  

    public function index()

    {

        return 'lalala';

    }

}

?>

跳转和重定向

Controller类提供了两个跳转的方法
success(msg,url)
error(msg)
这俩有固定页面模板:tp/tpl/dispatch_jump.tpl
配置文件app.php可以修改跳转页面

public function index()
    {
        if($this->flag)
            {
                $this->success('注册成功','../../../');
            }
            else{
                $this->error('失败');
            }
    }

空方法和空控制器

//空方法拦截
    public function _empty($name)
    {
        return '此方法不存在'.$name;
    }
<?php
namespace app\controller;
use think\Request;

  
    class Error
    {
        public function index(Request $r)
        {
            return '此方法不存在'.$r->controller();
        }
    }
?>
posted @ 2026-02-07 17:28  林u  阅读(16)  评论(0)    收藏  举报