Phalcon php多语言路由

时间:2014-09-09 19:08:38

标签: php routing multilingual phalcon

嗨,我是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/');
}

1 个答案:

答案 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;
});