• 注册
  • 赞助本站

    • 微信
    • 支付宝
    • Q Q

    感谢一直支持本站的所有人!

    • 查看作者
    • 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
    • 103