Easiest way to map route in PHP

情到浓时终转凉″ 提交于 2019-12-02 05:33:43

问题


I was browsing Symfony's website. I didn't really feel like I need all the functionality the framework offers, but I did like the routing part. It allows you to specify URL pattern like this

/some/path/{info}

Now for URL like www.somewebsite.com/app.php/some/path/ANYTHING it would allow you to send client a response specific for this URL. You could also use string ANYTHING and use it similar as GET parameter. There is also option to hide app.php part of the URL which leaves us URL like www.somewebsite.com/some/path/ANYTHING. My question is what's best approach to do this without a complex framework?


回答1:


I recommend this article http://net.tutsplus.com/tutorials/other/a-deeper-look-at-mod_rewrite-for-apache/ to understand url rewrite using apache mod_rewrite you do not need any framework just php. Also this is what in the depth any framework implements




回答2:


I have made my own mini-framework with the same routing syntax. Here's what I do:

  1. Use MOD_REWRITE to store the parameters (like /some/path/{info}) in a $_GET variable I call params:

    RewriteRule ^(.+)(\?.+)?$ index.php?params=$1 [L,QSA]

  2. Parse the parameters and store them globally using this function:

public static function parseAndGetParams() {

        // get the original query string

        $params = !empty($_GET['params']) ? $_GET['params'] : false;

        // if there are no params, set to false and return
        if(empty($params)) {
            return false;
        }

        // append '/' if none found
        if(strrpos($params, '/') === false) $params .= '/';

        $params = explode('/', $params);
        // take out the empty element at the end
        if(empty($params[count($params) - 1])) array_pop($params);

        return $params;
    }
  1. Route to the proper page dynamically:

    // get the base page string, must be done after params are parsed
    public static function getCurPage() {
        global $params;
    
        // default is home
        if(empty($params))
        return self::PAGE_HOME;
        // see if it is an ajax request
        else if($params[0] == self::PAGE_AJAX)
        return self::PAGE_AJAX;
        // see if it is a multi param page, and if not, return error
        else {
            // store this, as we are going to use it in the loop condition
            $numParams = count($params);
    
            // initialize to full params array
            $testParams = $params;
            // $i = number of params to include in the current page name being checked, {1, .., n}
            for($i = $numParams; $i > 0; $i--) {
                // get test page name
                $page = strtolower(implode('/', $testParams));
    
                // if the page exists, return it
                if(self::pageExists($page))
                    return $page;
    
                // pop the last param off
                array_pop($testParams);
            }
    
            // page DNE go to error page
            return self::PAGE_ERROR;
        }
    }
    

The value here is that it looks for the most specific page to the least specific page. Also, workout outside of a framework gives you complete control so if there's a bug somewhere, you know you can fix it - you don't have to look up some weird workaround in your framework.

So now that $params is global, any page that uses a parameter simply calls $params[X] to work with it. Friendly URLs without a framework.

The way I add pages then is I put them into an array that is looked at in the pageExists($page) call.

For AJAX calls, I put in a special IF:

// if ajax, include it and finish
if($page == PageHelper::PAGE_AJAX) {
    PageHelper::includeAjaxPage();
    $db->disconnect();
    exit;
}

And voila - your own micro routing framework.




回答3:


The problem is that a routing is a complex thing in a framework.

Perhaps you take a look at Silex. Its a micro-framework based on the Symfony2 Components. Its not so big as Symfony2 but have some of the features.



来源:https://stackoverflow.com/questions/10078816/easiest-way-to-map-route-in-php

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!