【问题标题】:CakePHP 3: switching between Router scopesCakePHP 3:在路由器范围之间切换
【发布时间】:2017-10-08 18:56:46
【问题描述】:

我有一个简单的路由设置来处理不同的语言。目标是将语言作为 URL 中的第一个参数,例如 /en/docs/de/docs。语言定义设置为scopes,如下所示:

$builder = function ($routes)
{
  $routes->connect('/:controller', ['action' => 'index']);
  $routes->connect('/:controller/:action/*', ['action' => 'index']);
};

$languages = ['en', 'de'];
foreach ($languages as $lang) {
  Router::scope('/'.$lang, ['language' => $lang], $builder);
}

Router::addUrlFilter(function ($params, $request) {
  if ($request->param('language')) {
    $params['language'] = $request->param('language');
  }
  else {
    $params['language'] = 'en';
  }
  return $params;
});

每个范围都按预期工作。即使有一些更复杂的连接和前缀(我从上面的代码中删除了它们以使代码更具可读性)。

现在的问题是:如何创建链接以在语言(范围)之间切换?

我尝试了不同的url,但是根据当前的url(例如/de/docs),语言参数对创建的url没有任何影响:

Router::url(['language' => 'en', 'controller' => 'docs']);
// -> /de/docs (expected: /en/docs)
Router::url(['language' => 'de', 'controller' => 'docs']);
// -> /de/docs

如何修复路由以获取预期的 url?

【问题讨论】:

    标签: php cakephp routes cakephp-3.x


    【解决方案1】:

    我找到了这种行为的原因。 addUrlFilter 函数在生成 url 时替换了语言参数,结果始终是当前语言。此功能的更新版本可以完成这项工作:

    Router::addUrlFilter(function ($params, $request) {
      if (!isset($params['language'])) {
        $params['language'] = $request->param('language');
      }
      return $params;
    });
    

    呸,一小时的搜索和尝试……

    【讨论】:

      猜你喜欢
      • 2016-10-18
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多