嗨,我是php世界的新手。 我想知道处理多语言路由的最佳方法是什么? 我开始用Phalcon php创建一个网站。 我有以下路由结构。
$router->add('/{language:[a-z]{2}}/:controller/:action/:params', array(
'controller' => 2,
'action' => 3,
'params' => 4,
));
$router->add('/{language:[a-z]{2}}/:controller/:action', array(
'controller' => 2,
'action' => 3,
));
$router->add('/{language:[a-z]{2}}/:controller', array(
'controller' => 2,
'action' => 'index',
));
$router->add('/{language:[a-z]{2}}', array(
'controller' => 'index',
'action' => 'index',
));
我的问题是例如,当我访问mywebsite.com/时,我想在调度程序中更改我的网址,如mywebsite.com/en/或其他语言。在beforeDispatchLoop中处理它是一个好习惯吗?我寻求最好的解决方案。
/**Triggered before entering in the dispatch loop.
* At this point the dispatcher don't know if the controller or the actions to be executed exist.
* The Dispatcher only knows the information passed by the Router.
* @param Event $event
* @param Dispatcher $dispatcher
*/
public function beforeDispatchLoop(Event $event, Dispatcher $dispatcher)
{
//$params = $dispatcher->getParams();
$params = array('language' => 'en');
$dispatcher->setParams($params);
return $dispatcher;
}
此代码根本不起作用,我的网址不会改变。网址保留mywebsite.com/而不是mywebsite.com/en/ 提前致谢。
我尝试上面的一个解决方案。 重定向似乎不起作用。我甚至尝试对其进行硬编码以进行测试。
use Phalcon\Http\Response;
//Obtain the standard eventsManager from the DI
$eventsManager = $di->getShared('eventsManager');
$dispatcher = new Phalcon\Mvc\Dispatcher();
$eventsManager->attach("dispatch:beforeDispatchLoop",function($event, $dispatcher)
{
$dispatcher->getDI->get('response')->redirect('/name/en/index/index/');
}
答案 0 :(得分:0)
我觉得你很困惑。如果我理解正确:如果用户在未指定语言的情况下打开页面,则需要将用户重定向到有效网址。
如果是这种情况,您应该在事件处理程序中验证是否指定了语言参数,并将用户重定向到相同的URL +默认语言(如果缺少)。我还假设您的beforeDispatchLoop
位于您的控制器中,这也是问题的一部分,因为没有语言的路由永远不匹配,您永远不会进入该控制器。相反,您需要根据documentation将其用作事件管理器的事件处理程序。以下是你如何完成整个事情。
$di->get('eventsManager')->attach("dispatch:beforeDispatchLoop", function(Event $event, Dispatcher $dispatcher)
{
$params = $dispatcher->getParams();
// Be careful here, if it matches a valid route without a language it may go into a massive
// recursion. Really, you probably want to use `beforeExecuteRoute` event or explicitly
// check if `$_SERVER['REQUEST_URI']` contains the language part before redirecting here.
if (!isset($params['language']) {
$dispatcher->getDI->get('response')->redirect('/en' . $_SERVER['REQUEST_URI']);
return false;
}
return $dispatcher;
});