ThinkPHP6.0 入门【二】,url访问模式,控制器定义,基础、空、多级,验证

ThinkPHP6.0 入门【二】,url访问模式,控制器定义,基础、空、多级,验证

       本学习课程以学习为目的一周三篇持续更新,学习代码更新在码云公开仓库,不足之处欢迎朋友们前来指导,写作不易请多多支持,本人创作新手写的不好,不喜勿喷,谢谢大家。

学习目标

  1. url解析
  2. url兼容模式
  3. 控制器定义
  4. 渲染输出
  5. 基础控制器
  6. 空控制器
  7. 多级控制器

一.url解析 

码云编号:d3d526f18ec814574ae88504a08d0eda5bafd0b3

  1. thinkPHP框架的许多操作都是通过url来实现的,官方是这么介绍的:
    ​
    6.0的URL访问受路由影响,如果在没有定义或匹配路由的情况下(并且没有开启强制路由模式的话),则是基于:
    http://serverName/index.php(或者其它入口文件)/控制器/操作/参数/值…
    如果使用自动多应用模式的话,URL一般是                                                          
    http://serverName/index.php/应用/控制器/操作/参数/值...
    ​

    我们的实际操作是

  2. 单应用http://tp.com/index.php/控制器/方法/参数/值…                                                              多应用http://tp.com/index.php/应用/控制器/方法/参数/值…
  3. 先讲单应用:这里http://tp.com是指域名地址,比如 127.0.0.1:8000 或 localhost/Tp60-learning/index.php是应用根目录public下的index.php即入口文件,                                     
    ThinkPHP6.0 入门【二】,url访问模式,控制器定义,基础、空、多级,验证
                                                                                   控制器 我们在应用根目录app目录下的controller控制器文件夹下新建admin.php控制器文件。地址则写为admin, 方法   例如admin控制器的hello方法,参数和值   例如hello方法的默认参数name 和空值                                                                                                 
    ThinkPHP6.0 入门【二】,url访问模式,控制器定义,基础、空、多级,验证
  4. 那么完整的地址则为    http://tp.com/index.php/admin/hello/name/worid     网页输出“hello,worid”
  5. 多应用:由于thinkPHP默认是单应用模式,多应用的话需要作为扩展安装,为避免混淆,后边再讲
  6. URL重写:可以通过URL重写隐藏应用的入口文件index.php(也可以是其它的入口文件,但URL重写通常只能设置一个入口文件),下面是相关服务器的配置参考
     在httpd.conf 配置文件中加载了 mod_rewrite.so 模块
     将AllowOverride None 将选项  None 改为 All ;                                                                       
    ThinkPHP6.0 入门【二】,url访问模式,控制器定义,基础、空、多级,验证

    ThinkPHP6.0 入门【二】,url访问模式,控制器定义,基础、空、多级,验证

    ThinkPHP6.0 入门【二】,url访问模式,控制器定义,基础、空、多级,验证
      

  7. 对于 Apache还需要把下面的内容保存为.htaccess文件放到应用入口文件的同级目录下(一般来说如果你是通过Composer安装,这些配置是框架默认配置,无需修改)
    <IfModule mod_rewrite.c>
      Options +FollowSymlinks -Multiviews
      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
    </IfModule>
  8. 做完上边步骤,重启apache后则可以:http://tp.com/admin/hello/name/worid  访问了

 二.兼容模式

码云编号:c0ce7020f8d0db4eb1d9fd20badaacf6b60d87a4

  1. 以上已经了解url的访问,通过admin控制器的讲解
  2. 如果上面url重写不支持,或服务器不支持PATHINFO,也可以使用兼容模式
    http://tp.com/?s=admin/hello/name/worid
  3. 如果提示:No input file specified.
    解决办法是打开public下的.htaccess文件,
    把:RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
    改为:RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]

三.控制器定义

  1. 控制器,就是  controller ,控制器文件存放在 controller 目录下
  2. 如果想改变系统默认的控制器文件目录,可以在 config route.php 配置文件找到:
    // 访问控制器层名称
    'controller_layer'      => 'controller',
    //例如修改为
    'controller_layer'      => 'controllersite',
  3. 类名和文件名大小写保持一致,并采用驼峰式(首字母大写)
    <?php
    namespace app\controller;
    class Site
    {
        public function index(){
            return "hello worid";
        }
    }
  4. 从上面得知 Site .php 的实际位置为:app\controller\Site.php,  访问URL地址是(假设没有定义路由的情况下)http://tp.com/site/index
  5. 我们接着创建一个hello方法
    <?php
    namespace app\controller;
    class Site
    {
        public function index(){
            return "hello worid";
        }
        public function hello(){
            return "123";
        }
    }
    
  6.  Site  控制器 两个方法 index( 默认 ) hello ,访问 URL 如下:
    http://tp.com/site (由于每个控制器的index方法是默认方法,此时访问index方法可以免写)
    http://tp.com/site/hello
  7. 如果我们创建双单词控制器该如何访问,我们创建一个hello worid,和一个默认index方法
    <?php
    namespace app\controller;
    class HelloWorid 
    {
        public function index(){
            return 'hello worid';
        }
    }
    访问方式如下
    http://tp.com/helloworid
    http://tp.com/hello_worid
  8. 如果你想避免引入同类名时的冲突,可以 route.php 设置控制器后缀开启,
    // 操作方法后缀
    'action_suffix'         => '',
    //打开设置
    'action_suffix'         => 'true',
    设置此选项是因为,后边使用模型的时候模型名和控制器名相同,为了避免混淆使用,此设置打开后就需要为控制器增加Controller后缀,比如前面的Site控制器就需要更名为SiteController.php

四.渲染输出

码云编号:85a21c00bab259b23287fe8e63595e4456a3da59

  1. ThinkPHP 直接采用方法内 return 返回的方式直接就输出
    public function index(){
            return 'hello worid';
        }
  2. 如果返回值为数组,则需要使用json函数转换输出
    <?php
    namespace app\controller;
    class HelloWorid 
    {
        public function index(){
            return 'hello worid';
        }
        public function date(){
            $date = array('a'=>1, 'b'=>2, 'c'=>3);
            return json($date);
        }
    }
  3. 渲染模板输出,暂且放到后边讲。
  4. 如果在开发过程,需要调试中断,可以使用halt(),不推荐使用die、exit、等方法中断输出 
    <?php
    namespace app\controller;
    class HelloWorid
    {
        public function index(){
            return 'hello worid';
        }
        public function date(){
            $date = array('a'=>1, 'b'=>2, 'c'=>3);
            $data = 'abc';
            halt('测试');
            return json($date);
        }
    }

五.基础控制器 

码云编号:6196cdf6fb1987b3b8757763889720b4a77bafd4

  1. 一般来说,创建控制器后,推荐继承基础控制器app\BaseController来获得更多的方法,基础控制器仅仅提供了控制器验证功能,并注入了think\App和think\Request,这两个对象后面会有章节详细讲解,下面我们继承并简单使用一下:返回当前实际路径
    <?php
    namespace app\controller;
    use app\BaseController;
    class Basics extends BaseController
    {
        public function index() {
            //返回实际路径
             return $this->app->getBasePath();
        }
    }
  2. 返回当前方法名

    <?php
    namespace app\controller;
    use app\BaseController;
    class Basics extends BaseController
    {
        public function index() {
            //返回实际路径
            //return $this->app->getBasePath();
            // //返回当前方法名
             return $this->request->action();
        }
    }
  3. 控制器验证,我们来写一个test方法

    <?php
    namespace app\controller;
    use app\BaseController;
    use think\exception\ValidateException;
    class Basics extends BaseController
    {
        public function index() {
            //返回实际路径
    //         return $this->app->getBasePath();
            // //返回当前方法名
             return $this->request->action();
        }
        //验证方法,验证定义值是否合法
        public function test(){
            try {
                $this->validate( [
                    'name'  => 'thinkphp',
                    'email' => 'thinkphp@qq.com',
                ],  'app\validate\User');
            } catch (ValidateException $e) {
                // 验证失败 输出错误信息
                dump($e->getError());
            }
        }
    }

    访问地址:http://tp.com/Basics/test 提示错误,那是因为我没有设置验证器

  4. 在app目录下创建 validate目录,并创建user验证器user.php文件

    <?php
    namespace app\validate;
    use think\Validate;
    class User extends Validate
    {
        protected $rule = [
            //设置规则
            //name 不能为空,长度为25
            'name'  => 'require|max:25',
            'age'   => 'number|between:1,120',
            'email' => 'email',
        ];
    }

    我们在次访问:http://tp.com/Basics/test,没有报错,也没有输出,我们把test方法的name设置为空再试一下,页面输出“^ "name不能为空"”

  5. 我们可以再完善一下自定义错误提示信息

    <?php
    namespace app\validate;
    use think\Validate;
    class User extends Validate
    {
        protected $rule = [
            //设置规则
            //name 不能为空,长度为25
            'name'  => 'require|max:25',
            'age'   => 'number|between:1,120',
            'email' => 'email',
        ];
        protected $message  =   [
            'name.require' => '名字都不填,食屎呀雷',
            'name.max'     => '名称最多不能超过25个字符',
            'age.number'   => '年龄必须是数字',
            'age.between'  => '年龄只能在1-120之间',
            'email'        => '邮箱格式错误',
        ];
    }

    我们刷新一下,错误信息提示“^ "名字都不填,食屎呀雷"”

六.空控制器 

码云编号:3619d2600402ba36b3581ead7a4b168f42735fb5

  1. 空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位当前应用下的空控制器(Error)类,利用这个机制我们可以用来定制错误页面和进行URL的优化
  2. 在单应用模式下,我们可以给项目定义一个 Error 控制器类,来提醒错误; 
    <?php
    namespace app\controller;
    class Error
    {
        public function index(){
            return '当前控制器不存在';
        }
    }
  3. 此时我们访问一个不存在的控制器如user控制器 
    http://tp.com/user  

ThinkPHP6.0 入门【二】,url访问模式,控制器定义,基础、空、多级,验证

 系统会自动跳转到Error控制器,并执行返回定义的内容,

七.多级控制器

码云编号:8c1e63cbf1ca598014d514e23464e21e770edc8f

  1. 所谓多级控制器,就是在控制器 controller 目录下再建立目录并创建控制器,
  2. 个人理解,其实除了命名空间需要修改,引用路径不同和访问方式不同,其他和正常控制无太大差异
  3. 现在我们就在 controller 目录下建立user   目录,并创建username .php 控制器
    <?php
    namespace app\controller\user;
    class UserName
    {
        public function user(){
            return 'index';
        }
    }
  4. 我们需要访问的地址为
    http://tp.com/user.username/user

    只需用点连接controlle下的user目录和user目录的username控制器即可

                       

点击阅读全文

上一篇 2023年 6月 11日 am10:15
下一篇 2023年 6月 11日 am10:16