Kohana路由(和重新路由)问题

时间:2013-02-05 18:43:16

标签: php kohana kohana-3

我正在使用PHP 5.5和Kohana 3.3

我正在开发一个网站结构,它总是将用户的语言偏好作为uri的第一个“项目”。

例如:

mydomain.com/en/products mydomain.com/de/store

现在,我确信有些用户会尝试聪明并输入类似的内容:

mydomain.com/products

这很好,我只是希望将它们重新路由到

mydomain.com/en/products以保持一致。

只要uri在URI中只有一个“目录”,我在下面的代码就可以了。

mydomain.com/products

mydomain.com/store

但不是像其他子目录那样的uris:

mydomain.com/products/something mydomain.com/store/purchase/info

以下是我的路线:

Route::set('home_page', '(<lang>)')
    ->defaults(array(
        'controller' => 'Index'
    ));

Route::set('default', '(<lang>(/<controller>(/<action>(/<subfolder>))))')
    ->defaults(array(
        'controller' => 'Index',
        'action' => 'index'
    ));

以下是我的父控制器中的每个其他控制器继承自:

的代码
public function before()
        {           
            $this->uri = $this->request->uri();

            $this->lang = $this->request->param('lang');

            //If user directly inputted url mydomain.com without language information, redirect them to language version of site
            //TODO use cookie information to guess language preferences if possible
            if(!isset($this->lang))
            {
                $this->redirect('en/', 302);
            }

            //If the first part of path does not match a language redirect to english version of uri
            if(!in_array($this->lang, ContentManager::getSupportedLangs()))
            {
                $this->redirect('en/'.$this->uri, 302);
            }
          }

1 个答案:

答案 0 :(得分:1)

你可以用这个给出的两条路线替换:

Route::set('default', '(<lang>/)(<controller>(/<action>(/<subfolder>)))',
array(
    'lang' => '(en|fr|pl)'
))
->defaults(array(
    'controller' => 'Index',
    'action' => 'index'
));

其中字符串(en | fr | pl)是您支持的语言的串联,即'('.implode('|', ContentManager::getSupportedLangs()).')'

如果这个解决方案仍然模糊不清,我很乐意更详细地解释它,但我希望您能够反思您的问题,因为您的第一个路线home_page,与...相匹配mydomain.com/products

你的控制器&#39; before()功能也应该修改。重定向不会起作用,因为您将最终重定向到例如重定向到重定向。 en/ru/Index。那么为什么不保持简单并使用:

    public function before()
    {           
        $default_lang = 'en';
        $this->lang = $this->request->param('lang', $default_lang);
    }