一. 入口文件的隐藏
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官方文档整理而成
请登录之后再进行评论