CakePHP 3.x - 仅在前缀中的扩展路由器

Posted

技术标签:

【中文标题】CakePHP 3.x - 仅在前缀中的扩展路由器【英文标题】:CakePHP 3.x - Extension router in prefix only 【发布时间】:2017-04-08 18:36:35 【问题描述】:

我正在开发一个应用程序,该应用程序具有可供用户使用的一侧(仪表板)和一个后端(API)。我希望 API 端有输出 JSON 的页面。感谢 Cake,使用来自控制器的 $this->set('_serialize', [...]); 和路由器设置:Router::extensions(['json', 'xml']); 使这变得容易。我使用前缀路由对 API 页面进行分组。

问题:如何让 API 页面只支持来自扩展路由器的 *.json 页面?

我尝试过的事情

显然,将 Router::extensions(['json', 'xml']); 行放在 routes.php 主范围内可以使其在任何地方都可以工作。

Router::extensions(['json', 'xml']); 行放在前缀范围内...

Router::prefix('api', function ($routes) 
     //...
     Router::extensions(['json', 'xml']);
     //...
);

...使其在任何地方都可以工作在 API 前缀内。

把它放在一个新的范围内......

Router::scope('/api', function ($routes) 
   $routes->extensions(['json', 'xml']);
);

...也让它无处不在。

【问题讨论】:

你读过book.cakephp.org/3.0/en/development/…吗? 是的,我已经阅读了文档。 【参考方案1】:

前缀也是范围,只是具有附加功能(它基本上是scope() 的简写方法并传递prefix 选项)。事实上,即使没有通过scope() 方法显式连接,每条路由都是有作用域的。

使用传递给prefix() 方法的回调的路由构建器,正如文档中的scope() 示例和您的问题所示:

Router::prefix('api', function ($routes) 
    $routes->extensions(['json']);
    // ...
);

并确保不要在任何地方使用Router::extensions(['json', 'xml']);

另见

Cookbook > Routes > Routing File Extensions

【讨论】:

啊,成功了。我犯的错误是使用Router::extensions(['json', 'xml']); 而不是$routes->extensions(['json', 'xml']);

以上是关于CakePHP 3.x - 仅在前缀中的扩展路由器的主要内容,如果未能解决你的问题,请参考以下文章

CAKEPHP 1.2/1.3 中的前缀路由和插件

CakePHP 中的本地化路由:如何重定向到默认语言

Cakephp 3 带有语言参数的路由

Cakephp 3.x 保存 hasmany 关联

CakePHP HTML Helper添加前缀URL

这个回调如何对 cakePHP 组件起作用?