• 中文
    • English
  • 注册
  • 查看作者
  • 6:ThinkPHP入口文件配置和路由

    一.  入口文件的隐藏

    ThinkPHP是一个单入口的框架,所有的请求都通过public下的index.php接受,并由该文件转发到相应的功能代码中,在index.php中,ThinkPhP通过加载框架引导文件实现请求过滤等级制。

    因为所有的请求都需要通过index.php,所以我们在访问页面的时候,都需要在url中添加index.php才可以正确访问,比如http://localhost/index.php/index/index/index,为了解决这个问题,一般我们会选择将index.php隐藏,也就是隐藏入口文件。

    隐藏入口文件的步骤主要分为如下几步:打开apache安装目录中的httpd.confg,修改以下内容:

    • 在173行左右,开启以下扩展:LoadModule rewrite_module modules/mod_rewrite.so

    • 在Directory标签中,将AllowOverride none 设置为AllowOverride All

    • 重启apache

    • 将.htacess内容修改为以下内容:

    <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>

    值得注意的是,如果你是使用WAMP搭建的环境,那么不需要修改.htacess,而是需要httpd-vhost.conf文件中添加重写规则[1]

    <VirtualHost *:80>
        //开启重写
            RewriteEngine on
            //哪些文件路径不定义重写,我的css和js等文件是放在public路径下,所以在视图文件中以/public开头的url不重写路径(注意'/'需要使用'\’来进行转义)
            RewriteCond $1 !^(index\.php|\/public)
            //重写规则:可以不需要输入index.php来进行访问
            RewriteRule ^(.*)$ /index.php/$1 [L]
        //虚拟主机路径
            DocumentRoot "C:/****/project/lsm/"
            //虚拟主机访问地址自定义
            ServerName lings.dev
            <Directory "C:/****/project/lsm/">
                Options Indexes FollowSymLinks
                AllowOverride None
                Order allow,deny
                Allow from all
            </Directory>
    </VirtualHost>

    此时直接访问http://localhost/index/index/index便可以正确获取指定内容,而不需要再添加index.php

    二.  入口文件的绑定

    虽然我们通过隐藏入口文件隐藏了url中的index.php,但是模块名依旧需要我们输入,我们可以通过入口文件绑定来解决这个问题。

    在/app/index/controlelr/Index.php中,添加test方法:

    public function test()
    {
        return "test";
    }

    此时访问http://localhost/index/index/test,则页面显示test,那么如何将index/index也隐藏掉呢,我们可以直接在/public/index.php中,绑定index模块和index控制器:

    // 定义应用目录
    define('APP_PATH', __DIR__ . '/../app/');
    //自定义常量
    define('SITE_URL','http://localhost/blog');
    //绑定模块
    //define('BIND_MODULE','index'); //此时只需要访问http://localhost/index/test即可
    //绑定模块和控制器
    define('BIND_MODULE','index/index'); //此时只需要访问http://localhost/test即可
    // 加载框架引导文件
    require __DIR__ . '/../thinkphp/start.php';

    虽然通过上述的方法可以隐藏模块或者控制器,但是也会存在其他问题,按照上面的方式绑定后,只有index模块可以正常访问,而admin模块下的方法便会报错,所以一般小项目只有单个模块的站点会采用上述的方式,而复杂一点的大项目会采用下面的方式。

    假如现在我们的网站需要提供一个接口给第三方一些数据,我们一般会添加另外一个入口文件,在/public下复制index.php并更名为api.php,此时访问http://localhost/api.php,显示的依旧是/app/index/controller/Index.php中的index方法的内容,说明api.php和index.php的作用是相同的,接下来在api.php中定义BIND_MODULE:

    <?php
    
    // 定义应用目录
    define('APP_PATH', __DIR__ . '/../app/');
    
    //绑定模块
    define('BIND_MODULE','api');
    
    // 加载框架引导文件
    require __DIR__ . '/../thinkphp/start.php';

    此时再访问http://localhost/api.php,访问便不再是/app/index/controller/Index.php中的index方法的内容,而是/app/api/controller/Index.php中的index方法的内容,除了在api.php中绑定api模块这种方式外,我们还可以直接在/app/config.php中,将 入口自动绑定模块设置为true,可以达到同样的效果:

    'auto_bind_module' => true,

    而且假如/app/api/controller/Index.php中有一个test方法,我们也不需要再访问http://localhost/api.php/api/index/test,直接访问http://localhost/api.php/index/test即可

    三.  路由

    首先在/app/index/controller/Index.php添加info方法:

    public function info($name)
    {
        return "{$name}";
    
    }

    此时访问http://localhost/index/index/info/name/zhangjia (zhangjia.html也可以),页面显示zhangjia,可以看到url非常的臃肿,便引出了路由的概念,路由的作用是简化URL访问地址,并根据定义的路由类型做出正确的解析。

    编辑/app/route.php,添加以下内容开启路由:

    'info/:name' => '/index/index/info'

    在info方法中添加url助手函数根据路由规则生成url:

    public function info($name)
    {
        echo url('index/index/info',['name' =>'zj'])."<br/>";
        return "{$name}";
    
    }

    此时直接访问http://localhost/index/index/info/name/zhangjia会报错,而访问http://localhost/info/zhangjia显示以下内容:

    /info/zj.html
    zhangjia

    另外关于路由常用的两个配置是

    // 是否开启路由
    'url_route_on' => true,
    // 是否强制使用路由
    'url_route_must' => false,

    如果将强制使用路由设置为true,那么每个url都会按照路由的规则来访问,所以一般将其设置为false

    参考资料

    [1] CSDN:living_ren

    [1] 本文其他内容根据慕课网乌云龙老师:
    快速入门ThinkPHP 5.0–基础篇
    ThinkPHP官方文档整理而成

  • 0
  • 0
  • 0
  • 4.8k
  • 请登录之后再进行评论

    登录
    单栏布局 侧栏位置: