我在浏览的Symfony的网站。 我真的不觉得我需要所有的框架提供的功能,但我不喜欢的路由部分。 它允许你指定这样的URL模式
/some/path/{info}
现在,像URL www.somewebsite.com/app.php/some/path/ANYTHING
它允许您发送特定的客户端此URL的响应。 你也可以使用字符串任何东西,用它类似GET参数。 还有一个选项,隐藏这让我们喜欢的网址URL的一部分app.php www.somewebsite.com/some/path/ANYTHING
。 我的问题是什么是做,而无需复杂的框架最好的方法?
我推荐这篇文章http://net.tutsplus.com/tutorials/other/a-deeper-look-at-mod_rewrite-for-apache/使用Apache mod_rewrite的,你不需要任何框架只是PHP了解URL重写。 另外这是在任何深度框架实现
我已经用相同的路由语法我自己的迷你框架。 这是我做的:
使用mod_rewrite存储参数(如/some/path/{info}
的) $_GET
变量我叫params
:
RewriteRule ^(.+)(\?.+)?$ index.php?params=$1 [L,QSA]
解析参数,并将其储存在全球范围使用此功能:
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;
}
路由动态正确的页面:
// 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;
}
瞧 - 自己的微路由框架。
问题是,一个路由是一个框架,一个复杂的事情。
也许你看看Silex的 。 它的基础上,Symfony2的组件的微架构。 它没有那么大的Symfony2,但有一些特点。