Php 这是构建MVC(从teresko的帖子中收集的理解)和x2B的正确方法吗;将多语言支持合并到框架中?

Php 这是构建MVC(从teresko的帖子中收集的理解)和x2B的正确方法吗;将多语言支持合并到框架中?,php,model-view-controller,internationalization,multilingual,Php,Model View Controller,Internationalization,Multilingual,我是否正确理解MVC? 我已经阅读了用户teresko的许多帖子,我想我终于理解了现代MVC的真正概念。我制作了一张我如何理解它的图表,我希望有人能为我确认这一点,也许这个图表会帮助其他用户 我的计划目录结构是否“智能”? 我还想进入文件夹结构。我不太确定我是否计划使用一种非常聪明/高效的方法来构建它们。在我的根目录中,我有4个文件夹。模型文件夹包含3个子目录,称为数据映射器、域对象和服务。演示文稿文件夹包含两个子目录,自然称为视图和控制器。我根目录中的第三个文件夹是我不太确定的文件夹之一,名

我是否正确理解MVC?

我已经阅读了用户teresko的许多帖子,我想我终于理解了现代MVC的真正概念。我制作了一张我如何理解它的图表,我希望有人能为我确认这一点,也许这个图表会帮助其他用户

我的计划目录结构是否“智能”?

我还想进入文件夹结构。我不太确定我是否计划使用一种非常聪明/高效的方法来构建它们。在我的根目录中,我有4个文件夹。模型文件夹包含3个子目录,称为数据映射器、域对象和服务。演示文稿文件夹包含两个子目录,自然称为视图和控制器。我根目录中的第三个文件夹是我不太确定的文件夹之一,名为lib,它包含另外3个子文件夹、脚本、主题和模板(这是通过视图调用模板的好地方吗?)。我拥有的最后一个文件夹名为config(如果有人能想出更好的名字,欢迎提出建议)。这是我将放置路由器和基类以及任何此类文件的地方。我不只是为了我的框架的功能,我希望它在技术上是健全的,欢迎任何建议/建议,我希望在开始制作索引和路由器等之前,确保我对这一点的理解是正确的,这样我就不必重新开始。谢谢

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

(有点离题,但我需要将其纳入我的MVC框架规划中,这可能会对其他用户有所帮助,为了清楚、简洁地回答这个问题,需要理解网站的结构,并在上面对其进行详细描述)

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

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

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

这真的与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  |  label
-------------------------------------
 view         |  en        |  view
 dernières    |  fr        |  latest
 nouvelles    |  fr        |  news
注意:如果还返回查询的值,则可以使用
通过单个SQL查询执行此类操作。。WHERE translation IN()
,它允许您在一个请求中收集所有内容

这些条目用于两项任务:

  • 实际转换请求,以便匹配的参数实际具有与其对应的类/方法
  • 用于确定用户可能期望的语言
在此结束时,您应该对
请求
实例中的参数进行翻译,并根据一些标准确定
语言
参数并将其添加到该请求中

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

我的2美分

这真的不是所有的关系