4.ThinkPHP控制器

Posted 余生随缘~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.ThinkPHP控制器相关的知识,希望对你有一定的参考价值。

控制器的后缀

打开配置文件application/app.php,有如下配置

// 应用类库后缀
\'class_suffix\'           => false,
// 控制器类后缀
\'controller_suffix\'      => false,
# 表示默认情况下,控制器无特殊后缀。例如 Index控制器,文件名为Index.php

如果需要进行设置,可以设置为

\'class_suffix\'           => true,
\'controller_suffix\'   => \'Controller\',
# 表示控制器以Controller为后缀。例如Index控制器,文件名为IndexController.php

注:一般不建议进行修改,保持默认,框架默认给我们的配置

image-20200521213724828

使用命令创建模块(分组)

命令格式:

php think build --module 模块名称

例:

php think build --module admin

image-20200521214649018

创建控制器

创建控制器的方式有两种:

手动创建

application/模块目录/controller/目录下
命名规则:控制器名称(首字母大写) + (控制器后缀,默认没有) + .php

例:在application/index模块/controller/目录下,创建一个Demo控制器,访问输出demo/index

<?php

namespace app\\index\\controller;

use think\\Controller;

class Demo extends Controller {
    public function index(){
        return \'dmeo/index\';
    }
}

image-20200521220632571

注意:上面这种事pathinfo模式访问方法,需关闭强制路由设置,如果给这个控制器设置了路由则不用管

命令行方式创建【推荐】

创建标准控制器

如果模块目录不存在则会自动创建,所以创建控制器使用这个命令可以一步到位而不用使用上面的创建模块命令

php think make:controller --plain 模块名/控制器名  
# 参数说明
--plain 标准控制器 (默认创建的控制器是一个资源控制器,所以一般加上此选项)

例:

在index模块下创建一个Demo2控制器

php think make:controller --plain index/Demo2

image-20200521222145246

如果创建时,没有在模块名称,则默认创建到公共模块中 【common】

例:

php think make:controller --plain Demo

image-20200521222612222

创建资源控制器

如果创建时,没有在命令中加入--plain参数选项,则默认创建到公共模块中 【common】并且是资源控制器

资源控制器可以让你轻松的创建RESTFul资源控制器,可以通过命令行生成需要的资源控制器,例如:

// 生成index模块的Blog资源控制器
php think make:controller index/Blog

或者使用完整的命名空间生成

php think make:controller app\\index\\controller\\Blog

例:

php think make:controller  Demo2

image-20200521223025662

如果加上模块名则会在该模块下创建资源控制器

php think make:controller  index/Demo3

image-20200521223654831

然后你只需要为资源控制器注册一个资源路由:

Route::resource(\'blog\',\'index/Blog\');

设置后会自动注册7个路由规则,如下:

请求类型 生成路由规则 对应操作方法
GET blog index
GET blog/create create
POST blog save
GET blog/:id read
GET blog/:id/edit edit
PUT blog/:id update
DELETE blog/:id delete

前置操作方法

可以为某个或者某些操作指定前置执行的操作方法,设置 beforeActionList属性可以指定某个方法为其他方法的前置操作。

数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法。

例:访问index模块的Demo控制器的index或者welcome方法触发checkUser方法

<?php
namespace app\\index\\controller;
use think\\Controller;
class Demo extends Controller {
    //前置操作方法列表  了解即可
    protected $beforeActionList = [
        //无值的话为当前控制器下所有方法的前置方法
        \'first\',
        //要触发的方法   => 请求的方法,请求此方法,触发前面定义的方法
        \'checkUser\' => [\'index\',\'welcome\']
    ];

    public function index(){
        return \'dmeo/index\';
    }

    protected function first(){
        echo \'first<br/>\';
    }

    //public 和 protected 修饰均可,为了不让外部访问一般使用protected
    protected function checkUser(){
        echo \'aaaa<br/>\';
    }

    public function welcome(){
        return \'bbbb<br/>\';
    }
}

image-20200522154849151

页面跳转

在应用开发中,经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面。系统的\\think\\Controller类内置了两个跳转方法successerror,用于页面跳转提示。

success 跳转

pathinfo方式

例:

<?php

namespace app\\index\\controller;

use think\\Controller;

class Demo2 extends Controller{
    //
    public function index(){
        //pathinfo方式
        //第一种写法
        //return $this->success(\'登录成功\',\'/index/demo2/su\');

        //第二种写法,同控制器使用tp提供的生成url地址函数
        //同控制器下面可以直接写方法名 url(\'su\') 等价于\'/index/demo2/su\'
        //return $this->success(\'登录成功\',url(\'su\'));

        //第三种写法,不同控制器下面可以写控制器名/方法名
        return $this->success(\'登录成功\',url(\'index/index\'));  
    }

    //成功页面
    public function su(){
        return \'我是成功页面\';
    }
}

image-20200522162616008

自定义路由的方式

先在route\\route.php文件中定义控制器路由

例:

//定义控制器路由  模块/类名/方法名                路由别名
Route::get(\'aaa\', \'index/index/index\')->name(\'indexr\');

image-20200522163322493

然后在控制器中设置页面跳转

例:

//自定义路由
return $this->success(\'登录成功\',url(\'indexr\'));

image-20200522163721199

error跳转

error跳转同样写法同样支持pathinfo和自定义路由的方式success的四种写法error跳转同样支持,下面只尝试一种

例:

<?php

namespace app\\index\\controller;

use think\\Controller;

class Demo2 extends Controller{
    //
    public function index(){

        //错误
        return $this->error(\'异常错误\',url(\'er\'));
    }

    //错误页面
    public function er(){
        return \'我是错误页面\';
    }
}

image-20200522165522782

ajax请求返回success 跳转数据

这两种方法可根据不同的请求方式(http标准请求还是ajax请求),自动返回数据(html/json)

例:

1. 在public文件夹下创建ajax.html并写入ajax访问的内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.js"></script>
</head>
<body>
<script>
    $.get(\'/index/demo2/index\',{},data => console.log(data), \'json\');
</script>

</body>
</html>

image-20200522171446015

2. 在控制器中返回访问成功

<?php

namespace app\\index\\controller;

use think\\Controller;

class Demo2 extends Controller{
    //
    public function index(){

        return $this->success(\'登录成功\',url(\'index/index\'),[\'status\' => 1]);
    }
    
}

运行结果

image-20200522171934567

以上是关于4.ThinkPHP控制器的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:如何在控制器的几种方法中重用代码片段

片段中的媒体控制器

如何将这个 Objective-C 代码片段写入 Swift?

ASP.net MVC 代码片段问题中的 Jqgrid 实现

使用导航控制器按下后退按钮后如何防止前一个片段显示?

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段