2

我正在浏览 Symfony 的网站。我真的不觉得我需要框架提供的所有功能,但我确实喜欢路由部分。它允许您像这样指定 URL 模式

/some/path/{info}

现在对于像www.somewebsite.com/app.php/some/path/ANYTHING它这样的 URL,它允许您向客户端发送特定于该 URL 的响应。您也可以使用字符串 ANYTHING 并将其用作 GET 参数。还有一个选项可以隐藏 URL 的 app.php 部分,这让我们的 URL 像www.somewebsite.com/some/path/ANYTHING. 我的问题是没有复杂框架的最佳方法是什么?

4

3 回答 3

7

我用相同的路由语法制作了自己的迷你框架。这就是我所做的:

  1. 使用 MOD_REWRITE 将参数(如/some/path/{info})存储在$_GET我调用的变量中params

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

  2. 使用此函数解析参数并全局存储它们:

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. 动态路由到正确的页面:

    // 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;
        }
    }
    

这里的是它从最具体的页面到最不具体的页面查找。此外,在框架之外进行锻炼可以让您完全控制,因此如果某处存在错误,您知道可以修复它 - 您不必在框架中查找一些奇怪的解决方法。

所以现在这$params是全局的,任何使用参数的页面都只是调用$params[X]它来使用它。没有框架的友好 URL。

然后我添加页面的方式是将它们放入一个在pageExists($page)调用中查看的数组中。

对于 AJAX 调用,我输入了一个特殊的IF

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

瞧——你自己的微路由框架。

于 2012-04-09T20:26:12.163 回答
4

我推荐这篇文章http://net.tutsplus.com/tutorials/other/a-deeper-look-at-mod_rewrite-for-apache/来理解使用 apache mod_rewrite 重写的 url,你不需要任何框架,只需要 php。这也是任何框架实现的深度

于 2012-04-09T19:59:20.173 回答
2

问题是路由是框架中的复杂事物。

也许你看看Silex。它是一个基于 Symfony2 组件的微框架。它没有 Symfony2 大,但有一些功能。

于 2012-04-09T19:50:10.387 回答