人生如顾戏如人生 發表於 2023-5-30 00:00:00

phpcms关于url路由在二次开发中的使用方法介绍-实现泛解析

<p>
首先,路由是负责将用户请求映射到特定的 MVC 控制器操作.v9默认的路由文件是 caches\configs\route.php ,默认路由如下:</p>
<p>
 </p>
<div>

<p>
代码如下:</p>
</div>
<div id="phpcode15">
<br>
'default'=&gt;array('m'=&gt;'content', 'c'=&gt;'index', 'a'=&gt;'init')</div>
<p>
 </p>
<p>
default是默认路由,在没有任何匹配的情况下,将映射到content模块index文件的init方法.</p>
<p>
我们再来看下路由是在哪里被处理的.打开\phpcms\libs\classes\param.class.php ,找到下面一句代码:</p>
<p>
 </p>
<div>

<p>
代码如下:</p>
</div>
<div id="phpcode16">
<br>
$this-&gt;route_config = pc_base::load_config('route', SITE_URL) ? pc_base::load_config('route', SITE_URL) : pc_base::load_config('route', 'default');</div>
<p>
 </p>
<p>
这里读取路由配置,根据常量 SITE_URL 查找是否存在路由配置,如果存在就加载,否则就加载默认的default配置.</p>
<p>
SITE_URL这个常量是做什么的呢?看看他的定义:</p>
<p>
 </p>
<div>

<p>
代码如下:</p>
</div>
<div id="phpcode17">
<br>
//当前访问的主机名<br>
define('SITE_URL', (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''));</div>
<p>
 </p>
<p>
也就是我们访问的域名,比如 pic.jb51.net 或者 baike.jb51.net 又或者 bbs.jb51.net,不带http.</p>
<p>
那么,比如我们有一个域名 bbs.jb51.net ,他的动态访问地址是 m=bbs&amp;c=index&amp;a=init .那么我们在做过域名绑定到v9后,访问 bbs.jb51.net 就能定位到 m=bbs&amp;c=index&amp;a=init ,这时候就要依靠url路由.因此定义如下路由:</p>
<p>
 </p>
<div>

<p>
代码如下:</p>
</div>
<div id="phpcode18">
<br>
'bbs.jb51.net'=&gt;array('m'=&gt;'bbs', 'c'=&gt;'index', 'a'=&gt;'init'),</div>
<p>
 </p>
<p>
一个完整的url路由功能就实现了.利用此功能,可以实现泛解析到不同模块,不同栏目等等.<br>
比如给你的v9黄页模块做一个 yp.phpcms.cn 路由到 m=yp&amp;c=index&amp;a=init .<br>
这样每一个模块都是一个拥有二级域名的子站了,而同时利用v9的数据表分离功能,可以实现一些较大的应用.</p>
<p>
希望大家有好东西一起分享,诚招女性网站(prbr2百度收录2k以上)友链.谢谢.<br>
结尾国际惯例,回复可见.<br>
分享一个网站的泛解析处理方法:<br>
路由如下:</p>
<p>
 </p>
<div>

<p>
代码如下:</p>
</div>
<div id="phpcode19">
<br>
&lt;?php<br>
/**<br>
* 路由配置文件<br>
* 默认配置为default如下:<br>
* 'default'=&gt;array(<br>
* 'm'=&gt;'phpcms',<br>
* 'c'=&gt;'index',<br>
* 'a'=&gt;'init',<br>
* 'data'=&gt;array(<br>
* 'POST'=&gt;array(<br>
* 'catid'=&gt;1<br>
* ),<br>
* 'GET'=&gt;array(<br>
* 'contentid'=&gt;1<br>
* )<br>
* )<br>
* )<br>
* 基中“m”为模型,“c”为控制器,“a”为事件,“data”为其他附加参数。<br>
* data为一个二维数组,可设置POST和GET的默认参数。POST和GET分别对应PHP中的$_POST和$_GET两个超全局变量。在程序中您可以使用$_POST['catid']来得到data下面POST中的数组的值。<br>
* data中的所设置的参数等级比较低。如果外部程序有提交相同的名字的变量,将会覆盖配置文件中所设置的值。如:<br>
* 外部程序POST了一个变量catid=2那么你在程序中使用$_POST取到的值是2,而不是配置文件中所设置的1。<br>
*/<br>
/*二级域名泛解析的配置,包括以下几种<br>
项目&lt;a href="http://xiangmu.jb51.net/"&gt;http://xiangmu.jb51.net/&lt;/a&gt;<br>
地区&lt;a href="http://dq.jb51.net/"&gt;http://dq.jb51.net/&lt;/a&gt;<br>
医院&lt;a href="http://yiyuan.jb51.net/"&gt;http://yiyuan.jb51.net/&lt;/a&gt;<br>
*/&lt;/p&gt; &lt;p&gt; switch($GLOBALS['domain']){<br>
case 'www':<br>
$array = array('default'=&gt;array('m'=&gt;'content','c'=&gt;'index','a'=&gt;'init'));<br>
break;&lt;/p&gt; &lt;p&gt; default:<br>
$array = array(SITE_URL=&gt;domain( $GLOBALS['domain'] ) );<br>
break;&lt;/p&gt; &lt;p&gt; }&lt;/p&gt; &lt;p&gt; return $array;</div>
<p>
 </p>
<p>
其中函数 domain定义如下:</p>
<p>
 </p>
<div>

<p>
代码如下:</p>
</div>
<div id="phpcode20">
<br>
//二级域名泛解析后的处理<br>
function domain(){<br>
$domain = getcache('domain','commons');<br>
$domain_data = $domain[$GLOBALS['domain']];<br>
if( !empty($domain_data) ){<br>
return parse_domain($domain_data) ;<br>
}<br>
else{<br>
header("HTTP/1.1 404 Not Found");<br>
header("Status: 404 Not Found");<br>
$db = pc_base::load_model('http404_model');<br>
$db-&gt;add();<br>
echo file_get_contents(PHPCMS_PATH.'404.htm');<br>
}<br>
}&lt;/p&gt; &lt;p&gt;<br>
function parse_domain($array){&lt;/p&gt; &lt;p&gt; switch($array['type']){<br><br>
case '3833'://手术项目,也即栏目<br>
$catid = $array['keyid'];<br>
$id = $_GET['id'];<br>
$GET = $id ? array('id'=&gt;$id,'catid'=&gt;$catid) : array('catid'=&gt;$catid);<br>
$newarr = array('m'=&gt;'content','c'=&gt;'index','a'=&gt;$id ? 'show': 'lists','data'=&gt;array('GET'=&gt;$GET));<br>
$GLOBALS['catid'] = $catid;<br>
break;&lt;/p&gt; &lt;p&gt; case '3834'://城市地区<br>
$newarr = array('m'=&gt;'content','c'=&gt;'city','a'=&gt;'init','data'=&gt;array('GET'=&gt;array('areaid'=&gt;$array['keyid'])));<br>
$GLOBALS['cityid'] = $array['keyid'];<br>
break;&lt;/p&gt; &lt;p&gt;<br>
case '3835'://整形医院<br>
$newarr = array('m'=&gt;'yp','c'=&gt;'com_index','a'=&gt;'init','data'=&gt;array('GET'=&gt;array('userid'=&gt;$array['keyid'])));<br>
$GLOBALS['hospitalid'] = $array['keyid'];<br>
break;<br><br>
}<br>
return $newarr;&lt;/p&gt; &lt;p&gt; }</div>
<p>
 </p>
<p>
结合了联动菜单的地区,权当是抛砖引玉了.<br>
尤其注意</p>
<p>
 </p>
<div>

<p>
代码如下:</p>
</div>
<div id="phpcode21">
<br>
$newarr = array('m'=&gt;'content','c'=&gt;'city','a'=&gt;'init','data'=&gt;array('GET'=&gt;array('areaid'=&gt;$array['keyid'])));</div>
<p>
 </p>
<p>
这里的定义方式,数据的格式一定要正确.</p>
頁: [1]
查看完整版本: phpcms关于url路由在二次开发中的使用方法介绍-实现泛解析