CakePHP4.3というフレームワークを利用しています。
URLパラメータを参照して表示するコンテンツを切り替えていますが、URLパラメータから静的なURLに変更しています。
/articles/?lang=en
/articles/?lang=ja
↓↓↓
/en/articles/
/ja/articles/
既存のソースの修正範囲を最小限にするため下記のようにルーティングとコントローラーを修正しました。
PHP
1config/routes.php 2 3$routes->scope('/', function (RouteBuilder $builder) { 4 $builder->connect('/', ['controller' => 'articles', 'action' => 'index']); 5 6 $langs = ['en', 'ja']; 7 $p = ['lang' => implode('|', $langs)]; 8 $builder->connect('/:lang', ['controller' => 'articles', 'action' => 'index'], $p); 9 $builder->connect('/:lang/:controller', [], $p); 10 $builder->connect('/:lang/:controller/:action/*', [], $p); 11 12 $builder->fallbacks(); 13});
PHP
1src/Controller/ArticlesController.php 2 3class ArticlesController extends AppController 4{ 5 public function index() 6 { 7 // $lang = $this->request->getQuery('lang'); 8 $lang = $this->request->getParam('lang'); 9 10 ... 11 12 $articles = $this->paginate($this->Articles); 13 14 $this->set('articles', $articles); 15 $this->set('lang', $lang); 16});
ページの表示までは対応できたのですがページネーションのリンク先のURLの先頭に言語を追加することができませんでした。
そこで下記のように修正してみたところ、正常に動いてはいるのですが本来の手法ではないと感じてます。
PHP
1templates/Articles/index.php 2 3<?php 4// URLは正常に取得できている 5echo $this->Url->build(['lang' => $lang, 'controller' => 'Articles', 'action' => 'index']); 6 7// NG 8$this->Paginator->options(['url' => ['lang' => $lang]]); 9 10// OK (コントローラーの前に言語を追加してみた) 11$this->Paginator->options(['url' => ['controller' => $lang.'/articles']]); 12?> 13 14<?= $this->Paginator->first(); ?> 15<?= $this->Paginator->prev(); ?> 16<?= $this->Paginator->numbers(); ?> 17<?= $this->Paginator->next(); ?> 18<?= $this->Paginator->last(); ?> 19});
理想はビューのURL(aタグのhref)を修正せずにルーティングのみで対応したいのですが、CakePHPのルーティング仕様を把握できかねています。
どのようにすればビューやコントローラーはそのままでルーティングのみで対応できるでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。