使用MVC Foundation的动态路由 - i18n和l10n

时间:2010-01-02 13:48:24

标签: php model-view-controller routing url-rewriting internationalization

我最近一直在提高我的网络编程技能,以遵循更健全,更易于维护的MVC编码风格。但是,我以前用“自己动手”框架做的一件事是基于mod_rewrite的灵活动态路由。这似乎是像cakephp,zend等问题的一个痛处。它通过尝试复制我所拥有的功能而引起了一些麻烦。

在您自己的上下文中,您可以执行以下操作:

<custom htaccess rules before>
RewriteRule    ^([A-Za-z0-9-/]+)$    index.php?q=$1   [NC,L]

将所有匹配的url重写为处理url的任意脚本,将"/abc-123/abc-456/controller-value"等的组合解析为可以从数据库表中设置的任何页面或操作,函数等列表,硬编码,bla bla ..之前的自定义规则可以为服务器上的资源存在匹配的请求,或者设置管理路由等。

但是,一旦MVC网址策略启动,就很难用隐藏外部世界的应用程序逻辑来覆盖这种行为。我从来没有真正理解为什么有人想要向用户公开函数名称,这是我真正的bugbear。从可用性和安全性的角度来看,这似乎是不必要的,也是一种过于强烈的强加。

所以 - 问题是这样,如何在为应用程序保持稳固的MVC基础的同时,采用重写,可翻译和友好的URL策略?

要件:

  • 没有暴露应用程序逻辑
  • 可翻译网址(i18n)
  • 动态,能够在不触及应用程序代码的情况下添加,删除,编辑网址或网页
有趣的时间! :d

示例网址:

/en/news/story-title
/pt/noticias/titulo

其中网址根据传递的语言字符串检索本地化内容。

4 个答案:

答案 0 :(得分:2)

MVC只是一种与URL结构无关的架构模式。使用自定义路由层不会以任何方式破坏MVC。如果您可以使用集中路由,那么,例如,您可以使用配置文件将URL模式(正则表达式或某种简化语法)映射到控制器操作。

答案 1 :(得分:0)

我相信(虽然我不确定)Akelos支持可翻译网址。

答案 2 :(得分:0)

既然你似乎正在推动自己的MVC,那么是什么阻止你做你想做的事情?事实上,我是在自己的小MVP框架中自己做的。

我只是在域之后使用第一个段来加载同名的控制器(presenter),然后我将剩余的段和查询字符串作为数组传递给它。然后由每个控制器决定如何处理这些。

答案 3 :(得分:0)

既然你似乎正在推动自己的MVC,那么是什么阻止你做你想做的事情?事实上,我是在自己的小MVP框架中自己做的。

我只是在域之后使用第一个段来加载同名的控制器(presenter),然后我将剩余的段和查询字符串作为数组传递给它。然后由每个控制器决定如何处理这些。减去i18n的东西 - 我处理半全局。