RT.
最近楼主在研究ThinkPHP 3.2.2版本。在研究到form表单的提交问题的时候,发现使用框架提供的常量__URL__进行设置的时候,其所提供的URL路径总是会缺失了入口文件的身影。例如我有两个模块,一个是Home模块,一个是Admin模块,在使用__URL__简化我的action路径的时候总是会出现路径中间没有index.php或者是admin.php入口文件的问题。
于是楼主开始了研究:
1.__URL__是系统自我提供的常量。是判断当前Controller控制器的路径,不能够通过自定义来修改。一开始楼主想到的方法是通过死定义,也即写死form提交的时候action对应的action的URL路径,也即__APP_/admin.php/Admin/User/update。但是很明显这种情况是非常不讨好的。故虽然能够实现,我还是抛弃了。
2.通过研究__URL__的实际输出,楼主发现,__URL__其实是隐藏了入口文件。如果我使用了__URL__/update来定义form的action的话,实际上解析出来的路径是__APP__/Admin/User/update。所以楼主找到了方向,要使得__URL__/update这个方法可以使用,那么我要通过下面两个方法来实现:
2.1 项目通过一个入口文件,index.php来进入,然后根据后面模块的名称自动选择模块。
2.1.1修改index.php
<?php define('APP_DEBUG',TRUE); // 开启调试模式 require '../../thinkphp/ThinkPHP/ThinkPHP.php'; //thinkphp框架地址
2.1.2修改Home, Admin模块下面的/conf/config.php配置文件
例如,对于Home模块来说,其config.php里面返回的array配置文件对常量进行修改:
<?php $config = require './config.inc.php';//项目的公共配置文件,这个要看你有没有,如果没有,就直接修改默认生成的config.php中return的数组就可以 $array = array( //'配置项'=>'配置值' 下面就是自己添加的自定义的内容 'APP_GROUP_LIST'=>'Home, Admin', //模块列表 'DEFAULT_GROUP'=>'Home',//当前模块的名称 ); return array_merge($config, $array);//调用merge方法将两个数组进行合并,并返回同样的,对于Admin模块我们也需要添加上面的数组中常量的配置项,其中‘DEFAULT_GROUP’的值为Admin
2.2将index.php这个入口文件进行隐藏,使得URL中不需要出现index.php这个文件
2.2.1开启apache2对htaccess的支持
这个方法在ThinkPHP的官方文档里面有提及,但是由于楼主使用的系统是Ubuntu14.04.官方的文档包含了两个步骤,第一个步骤是修改apache2的httpd.conf文件。但是我无论如何也无法找到/etc/httpd.conf。但是却是可以发现存在着/etc/apache2/apache2.conf文件,所以我大胆猜测,Ubuntu版本下的apache2的配置文件是存在于/etc/apache2/apache2.conf下的。事实证明也是如此。所以要做的是,使得apache2支持.htaccess重定向方法。楼主这个配置了比较久,大家可以上google搜索一下ubuntu apache2 开启 htaccess支持的方法。下面我贴出一个比较可信的教程:
http://apt-blog.net/enable-htaccess-file-support-under-ubuntu
如果已经安装了a2enmod,则按照下面的教程进行:
http://zhangbobell.blog.51cto.com/7655227/1364529
对于需要修改AllowOveride这个可以到/etc/apache2/apache2.conf文件中搜索并修改对应的www目录(你所需要访问的读取.htaccess文件的目录)的属性为ALL。
2.2.2设置.htaccess文件
在入口文件的同级目录下面使用vim新建一个.htaccess文件,内容如下:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule>修改完,保存,并重启apache服务器。sudo /etc/init.d/apache2 restart.
至此,你会发现你的__URL__终于能够发挥作用了,而且你以后在访问你的模块的时候也不需要在前面打多一个入口文件了!