Zend framework Zend Framework路由器主机名和多语言支持
前两天我和Zend Framework Router发生了冲突,但仍然没有找到解决方案 现有项目有两个不同的模块,它们在同一领域工作,例如www.domain1.com: 默认-包含公共信息,可通过www.domain1.com访问 管理员-管理员界面,可通过www.domain1.com/admin访问 项目是多语言的,为了保留语言代码,它作为每个URL的第一个参数传输,例如www.domain1.com/en/www.domain1.com/en/admin 需要注意的部分代码是下一个插件:Zend framework Zend Framework路由器主机名和多语言支持,zend-framework,router,hostname,chain,Zend Framework,Router,Hostname,Chain,前两天我和Zend Framework Router发生了冲突,但仍然没有找到解决方案 现有项目有两个不同的模块,它们在同一领域工作,例如www.domain1.com: 默认-包含公共信息,可通过www.domain1.com访问 管理员-管理员界面,可通过www.domain1.com/admin访问 项目是多语言的,为了保留语言代码,它作为每个URL的第一个参数传输,例如www.domain1.com/en/www.domain1.com/en/admin 需要注意的部分代码是下一个插件:
class Foo_Plugin_Language extends Zend_Controller_Plugin_Abstract
{
const LANGUAGE_KEY = 'lang';
public function routeStartup(Zend_Controller_Request_Abstract $request)
{
$languagesRegexp = implode('|', array_map('preg_quote', $this->_bootstrap->getLanguages()));
$routeLang = new Zend_Controller_Router_Route(
':' . self::LANGUAGE_KEY,
array(self::LANGUAGE_KEY => $this->_bootstrap->getLanguage()->toString()),
array(self::LANGUAGE_KEY => $languagesRegexp)
);
$router = $this->getFrontController()->getRouter();
$router->addDefaultRoutes();
$chainSeparator = '/';
foreach ($router->getRoutes() as $name => $route) {
$chain = new Zend_Controller_Router_Route_Chain();
$chain
->chain($routeLang, $chainSeparator)
->chain($route, $chainSeparator);
$new_name = $this->_formatLanguageRoute($name);
$router->addRoute($new_name, $chain);
}
protected function _formatLanguageRoute($name)
{
$suffix = '_' . self::LANGUAGE_KEY;
if (substr($name, -strlen($suffix)) == $suffix) return $name;
return $name . '_' . self::LANGUAGE_KEY;
}
public function routeShutdown(Zend_Controller_Request_Abstract $request)
{
$lang = $request->getParam(self::LANGUAGE_KEY, null);
$this->_bootstrap->setLanguage($lang);
$actual_lang = $this->_bootstrap->getLanguage()->toString();
$router = $this->getFrontController()->getRouter();
$router->setGlobalParam(self::LANGUAGE_KEY, $lang);
// Do not redirect image resize requests OR get js, css files
if (preg_match('/.*\.(jpg|jpeg|gif|png|bmp|js|css)$/i', $request->getPathInfo())) {
return true;
}
// redirect to appropriate language
if ($lang != $actual_lang) {
$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
$params = array(self::LANGUAGE_KEY => $actual_lang);
$route = $this->_formatLanguageRoute($router->getCurrentRouteName());
return $redirector->gotoRouteAndExit($params, $route, false);
}
}
}
第一个问题是,您如何看待这种提供多语言支持的方式。我注意到,所有这些链大大降低了服务器的运行速度,服务器的响应时间约为4秒
主要问题是:目前我必须实现这样的功能:我有一个域名www.domain2.com,它应该只与单个模块一起工作,例如foobar。。。它应该可以通过第二个url获得。。。或者,当然,默认情况下,它应该像www.domain1.com/en/foobar一样工作
为了在Bootstrap类中提供此功能,我将实现这部分代码
// Instantiate default module route
$routeDefault = new Zend_Controller_Router_Route_Module(
array(),
$front->getDispatcher(),
$front->getRequest()
);
$foobarHostname = new Zend_Controller_Router_Route_Hostname(
'www.domain2.com',
array(
'module' => 'foobar'
)
);
$router->addRoute("foobarHostname", $foobarHostname->chain($routeDefault));
这是行不通的,正如我发现的routeDefault总是用默认值重写找到正确的模型名foobar
然后我实现了如下默认路由器:
new Zend_Controller_Router_Route(
':controller/:action/*',
array(
'controller' => 'index',
'action' => 'index'
);
);
但这仍然不起作用,只有在我用Foo_Plugin_语言注释routeStartup方法时才开始使用语言,但我需要语言支持,我已经使用了很多可能的代码组合,最后,我默认使用了以下方法来提供语言支持:
class Project_Controller_Router_Route extends Zend_Controller_Router_Route_Module
{
/**
*@param string$path
*@param bool$partial
*@return数组
*/
公共函数匹配$path,$partial=false
{
$result=数组
$languageRegexp = '%^\/([a-z]{2})(/.*)%i';
if (preg_match($languageRegexp, $path, $matches)) {
$result['lang'] = $matches[1];
$path = $matches[2];
}
$parentMatch = parent::match($path);
if (is_array($parentMatch)) {
$result = array_merge($result, $parentMatch);
}
return $result;
}
}
所以,从路径中小心地提取语言参数,并像往常一样对左侧部分进行常规处理
但当我编写下一个代码时,我无法通过www.domain2.com url访问foobar模块,因为请求中的模块名始终是默认的
$front = Zend_Controller_Front::getInstance();
/** @var Zend_Controller_Router_Rewrite $router */
$router = $front->getRouter();
$dispatcher = $front->getDispatcher();
$request = $front->getRequest();
$routerDefault = new Project_Controller_Router_Route(array(), $dispatcher, $request);
$router->removeDefaultRoutes();
$router->addRoute('default', $routerDefault);
$foobarHostname = new Zend_Controller_Router_Route_Hostname(
'www.domain2.com',
array(
'module' => 'foobar'
)
);
$router->addRoute("foobar", $foobarHostname->chain($routerDefault));
而不是摘要:
问题是,我应该实现一个特性,为辅助域提供对ZendFramework特定模块的访问,并且我应该保存多语言支持。我找不到一个方法,如何管理所有这些。。。
第二个问题是关于链路由器的性能,它使站点工作非常缓慢。。。
我解决多语言页面问题的方法如下: 最后一篇文章 当然,我的解决方案需要一些缓存,但我认为它会解决您的问题
干杯。回答您的问题:1.如果您将vhost配置为路由到项目,则zend可以管理到模块的路由;2.您可以缓存路由器以提高性能,memcache将是最快的。谢谢您的建议,我已经有了几乎相同的翻译系统。问题是,当我添加route Hostnam时在应用程序引导中,它不起作用,我不知道为什么会发生这种情况,它只是忽略了这个路由…您能尝试在项目范围内应用主机名路由器并验证它是否起作用吗?