如何制作动态路由系统?

时间:2018-07-16 08:51:13

标签: php url routing

我只是想创建一个动态路由系统或类似的东西。

这是我到目前为止所做的,

这是我的.htaccess文件,用于提供到index.php的所有路由。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]

我的index.php文件。

<?php 

//get request url
$url = rawurldecode($_SERVER['REQUEST_URI']);

//match the request url with above urls. 
//do i have to match the above URL with these each urls??
$array = array(
                'category' => array('hello','category1','category2'),
                'page' => array('page1','page2','page3'),
            );
 //here i am using array, but the URL can also come from database.
$flag = 0;
foreach($array as $key=>$arr)
{
    foreach($arr as $ar)
    {

        if(preg_match('/'.$ar.'/', $url) && $key == 'category'){
            include('category.php');
            $flag =1;
            exit;
        }
        elseif (preg_match('/'.$ar.'/', $url) && $key == 'page') {
            include('page.php');
            $flag =1;
            exit;
        }

    }


}
if($flag ==0)
{
    include('404.php');
}

在这里,我要做的是,如果我的路线匹配,我会将控件发送到单独的文件中,这将生成HTML或一些代码。

我在这里面临的问题是我是否必须将每个请求URL与保存的URL进行匹配,否则会有其他解决方案,因为如果有人在数据库或数组中有大约10,000个URL,相比较而言,

如果我做错了方法,请提供解决方案或纠正我。

1 个答案:

答案 0 :(得分:0)

通常,这种系统使用$_GET。因此,您将拥有一个名为modules的文件夹,其中将拥有所有页面。

所以

modules -> index    -> index.php
modules -> home     -> home.php
modules -> sign-in  -> sign-in.php
modules -> sign-out -> sign-out.php
modules -> 404      -> 404.php

然后您的链接分别如下所示:

<a href="?action=sign-out">Sign Out</a>

然后,您捕获每个请求中的$_GET['action']并使用is_dir和或file_exists检查模块目录,以查看$_GET['action']中的所述模块是否存在(如果存在)然后可以加载它,否则可以加载要显示的404或模块来代替错误页面。

这样做可以省去在数组中定义所有页面的麻烦。