【发布时间】:2017-08-04 16:38:26
【问题描述】:
我有一个网站,其中包含用户和条目,两者都存储在数据库中。每个条目都有自己的页面,使用它的 slug,每个用户都有一个公共配置文件,使用它的用户名。它们各自的 URL 可能如下所示:
- 条目:
https://example.com/hello-world - 用户:
https://example.com/test-user
用 CakePHP 3.4 重构上述网站(原来是用“vanilla” PHP 构建的),我实现了以下路线:
$routes->connect('/:slug',
['controller' => 'Entries', 'action' => 'view'],
['pass' => ['slug']]
);
$routes->connect('/:username',
['controller' => 'Users', 'action' => 'view'],
['pass' => ['username']]
);
入口页面就像一个魅力——在那里没有问题——但是当我尝试访问用户个人资料时,Cake 抛出一个RecordNotFoundException。这是有道理的,因为它正在寻找一个不存在的条目。
我希望在EntriesController 中从firstOrFail 切换到find 将允许应用程序继续下一条路线(因为不会抛出异常),但结果实际上更糟:它尝试在没有对象的情况下呈现条目视图,从而导致 PHP 通知在原本为空的布局上。
我已经阅读了 CakePHP 文档(“书”),但无法找到解决这个(我认为是通用的)问题的方法。我还尝试了许多其他(通常不太明显)的路线设置,但也没有运气。
现在我一直在想EntryOrUserController 之类的东西,但我怀疑这是否是最好的解决方案,甚至是一个好的解决方案。坦率地说,我认为这很愚蠢。我想我真的希望有一些控制器或中间件功能可以完全满足我的要求,但任何优雅的解决方案都可以。
附:我确实意识到默认的 CakePHP/MVC 方法是让 URL 更像这样:
- 条目:
https://example.com/entries/hello-world - 用户:
https://example.com/users/test-user
...但在这种情况下,这不是一个选项,所以谢谢,但不是。 ☺
【问题讨论】:
-
一个选项是测试记录是否存在的自定义路由类:stackoverflow.com/questions/34360539/…
-
谢谢,@ndm!我根据那里的发现发布了答案。