0

PHP 5.5 と Kohana 3.3 を使用しています

私は、uri の最初の「項目」としてユーザーの言語設定を常に持つ Web サイト構造を開発しています。

例えば:

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

さて、一部のユーザーは賢く、次のように入力しようとするでしょう。

mydomain.com/products

これで問題ありません。ルートを変更してもらいたいだけです

mydomain.com/en/productsすべての一貫性を保つために。

以下のコードは、URI に「ディレクトリ」が 1 つしかない限り機能します。

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);
            }
          }
4

1 に答える 1

1

指定された 2 つのルートを次の 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

コントローラーのbefore()機能も修正する必要があります。にリダイレクトすることになるため、リダイレクトはそのままでは機能しませんen/ru/Index。それでは、シンプルにして次のように使用してみませんか。

    public function before()
    {           
        $default_lang = 'en';
        $this->lang = $this->request->param('lang', $default_lang);
    }
于 2013-02-05T22:25:54.910 に答える