0

我是否正确理解 MVC?

我已经阅读了用户 teresko 的许多帖子,我想我终于理解了现代 MVC 的真正概念。我制作了一个图表来说明我的理解方式,我希望有人可以为我确认这一点,也许这个图表会帮助其他一些用户。

我计划的目录结构“聪明”吗?

我也想进入文件夹结构。我不太确定我是否计划使用一种非常智能/有效的方式来构建它们。在我的根目录中,我有 4 个文件夹。模型文件夹 包含 3 个子目录,分别称为data_mappersdomain_objectsservices演示文件夹包含 2 个自然称为视图控制器的子目录。我的根目录中的第 3 个文件夹是我不太确定的名为lib的文件夹之一,它包含另外 3 个子文件夹、脚本主题模板(这是视图调用模板的好地方吗?)。我拥有的最后一个文件夹称为config(如果有人能想到更好的名称,欢迎提出建议)。这是我将放置路由器和基类以及该类型的任何文件的地方。我不只是为我的框架寻求功能,我希望它在技术上是合理的,欢迎任何建议/建议,我想在开始制作索引和路由器之前确保我的理解是正确的等等我不必重新开始。谢谢

这是在 MVC 中实现多语言支持的好方法吗?

(有点题外话,但我需要将其纳入规划我的 MVC 框架,它可能对其他用户有帮助,并且为了清楚简洁地回答问题,需要了解网站的结构,它恰好是上面有详细描述)

我的网站必须提供英文和法文版本,而我恰好会说这两种语言。我计划在模板文件夹中再创建两个子文件夹,一个名为en和另一个fr,只需将所有英文模板放在 en 文件夹中,然后将它们翻译成法语并将它们放在 fr 文件夹中并设置网站,以便 www .mywebsite.com/en/home 以英语显示模板,www.mywebsite.com/fr/home 以法语显示模板。

将有一个主语言选择页面,将您重定向到 en 或 fr。然后,我计划将 2 个字母的语言代码存储在 $_SESSION 变量中。视图将使用这个 $_SESSION 变量来选择要显示的模板。这是我在旧版网站上的做法。这是在 MVC 中实现多语言支持的好方法还是有更好的方法?

如果我想让网址也出现在法语中怎么办?如果我将视图文件放在更多子文件夹中,而不是像这样命名它们:“/presentation/views/news/news.php”,像这样命名它们:“/pre sentation/views/news_nouvelles/news.php”,然后制作路由器(网址和路由是我的弱点之一,但我会自己学习;)将“_”之前的所有内容存储在对应于英文 url 的变量中,并将所有内容存储在对应于法文 url 的变量中。这只是一个理论,我还没有尝试过最后一段中的内容,多语言支持更多的是讨论而不是问题,尽管再一次,它是相关的,因为需要对我的框架有透彻的理解才能回答/讨论语言支持。

4

1 回答 1

5

这真的与 MVC 无关。当您实现多语言 URL 时,一切都与路由有关。

路由

基本上,当你的代码开始调用控制器上的东西时,你应该已经完全初始化了请求实例,它已经从 URL 识别语言并将输入的所有部分翻译成对创建实例有用的东西。

$request = new Request($query);

$router = new Router;
$router->import('/path/to/routes.json');
$router->route( $request );

此时,您将'/presentation/view/dernières/nouvelles'根据已识别的模式将用户的查询(来自示例:)拆分为已识别的段。

让我们举个例子,那个无光泽的图案在配置中定义为:

/presentation[[/:action[/:filter]]/:resource]

产生的结果是:

resource   >> 'nouvelles'
action     >> 'view'
filter     >> 'dernières'

国际化

翻译通常会存储在数据库或某些配置文件中。如果您的服务工厂此时已经初始化,那么您可以深入了解它以促进与此存储配置的交互:

$normalizer = new Normalizer( $serviceFactory->create('translation') );
$normalizer->adjust($request);

你会通过翻译从存储的配置中收集什么

  • translation用户在查询中提供的值
  • language该查询片段被写入其中
  • title对应于片段

您返回的数据如下所示:

 translation  |  language  |  label
-------------------------------------
 view         |  en        |  view
 dernières    |  fr        |  latest
 nouvelles    |  fr        |  news

注意:如果您还返回查询值,那么您可以使用单个 SQL 查询执行此类操作,这样您就可以
.. WHERE translation IN ( <the list> )在单个请求中收集所有内容。

这些条目用于两个任务:

  • 实际翻译请求,以便匹配的参数实际上具有与其对应的类/方法
  • 用于确定用户可能期望的语言

到此结束时,您应该翻译完Request实例中的所有参数,并根据一些标准确定并添加language参数到该请求。

注意:浏览器还会在标题中向您发送一些与语言相关的信息。根据您的设置,您可以使用Accepted-Language标头来确定用户可能更喜欢哪种语言。

my 2 cents

于 2013-08-05T21:13:10.843 回答