自从我学习了 Kohana 后,我的编程体验有了很大的提高,因为在使用 Kohana 之前,我从来没有考虑过我的 url 是如何构建的。在 MVC 世界中,使用 Pretty URLs 会让你真正思考你想要做什么以及如何去做。
在我看来,通过查看您在上面的示例中想要做的事情,在我看来您是在倒退。您说您首选的 URL 是: /about /about/internal /about/external /about/improvement /about/improvement/stat
在我看来,“关于”实际上是一个动作,而不是一个控制器。url "/about/" 非常令人困惑,因为它没有告诉我我正在获取什么信息,但我们可以放一张幻灯片,因为它可能与一般网站有关。“/about/internal”非常清楚,但在很多方面你都在尝试编写你的网址,以便它们以正确的英语阅读。实际上,我会将它们写为:/about、/internal/about、/external/about、/improvement/about、/improvement_stat/about
我不确定您为什么拒绝拥有多个控制器,除非您将控制器设置为模板控制器,并且您认为您必须为每个控制器都这样做。你没有。一般来说,我创建一个名为“page”的控制器,它是我的模板控制器。然后所有其他控制器扩展页面控制器。我可以在页面控制器中定义可以在扩展页面控制器的所有控制器中使用的常量和其他变量。
但是如果你真的拒绝编写多个控制器,你总是可以编写特定的路由来让你到达你想要的任何控制器和动作。例如,我使用一个路由进行比较,我希望最多 4 个 id 传递到我的路由中。我这样写了这条路线:
Route::set('thing_compare', 'thing/compare/<thing1>/<thing2>(/<thing3>(/<thing4>))')
->defaults(array(
'controller' => 'thing',
'action' => 'compare'
));
请注意,thing3 和 thing4 在括号中,这意味着它们是可选的。然后在我的控制器中,我可以通过执行以下操作来获取这些值:
$thing1 = $this->request->param('thing1');
但是回到您给出的示例,只需编写类似这样的路由(假设您的控制器名为“about”:
Route::set('about_internal', 'about/internal')
->defaults(array(
'controller' => 'about',
'action' => 'about_internal'
));
Route::set('about_external', 'about/external')
->defaults(array(
'controller' => 'about',
'action' => 'about_external'
))
就我个人而言,我会避免设置这样的路由,并真正重新考虑如何设置你的 url,以便它创建一个明智的设计策略。