Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在MVC的不同部分使用用户?_Php_Model View Controller - Fatal编程技术网

Php 如何在MVC的不同部分使用用户?

Php 如何在MVC的不同部分使用用户?,php,model-view-controller,Php,Model View Controller,好的,我正在构建一个MVC框架。比如说,我有一个歌曲控制器。在数据库中,对于每首歌曲,我都有歌曲的所有者id和用户id。如果我想通过获取用户id并从用户表中选择该id并获取诸如姓名、电子邮件等内容来访问用户信息,该怎么办?我知道存在连接,但在本例中,让我们假设没有连接。我能做什么?我可以创建一个UsersRepository类吗?另外,我想静态地调用它还是创建它的新实例。有多种方法来构造它 例如,可以使用UserModel,它是表示用户表的对象。 此对象不提供任何函数来启动带有联接的查询 然后,

好的,我正在构建一个MVC框架。比如说,我有一个歌曲控制器。在数据库中,对于每首歌曲,我都有歌曲的所有者id和用户id。如果我想通过获取用户id并从用户表中选择该id并获取诸如姓名、电子邮件等内容来访问用户信息,该怎么办?我知道存在连接,但在本例中,让我们假设没有连接。我能做什么?我可以创建一个UsersRepository类吗?另外,我想静态地调用它还是创建它的新实例。

有多种方法来构造它

例如,可以使用UserModel,它是表示用户表的对象。 此对象不提供任何函数来启动带有联接的查询

然后,您可以添加一个repository类,该类提供与查询相关的附加功能,跨越多个具有联接的表

用户模型 getUserName$userId 用户还原 GetSofUser$userId 您可以将其视为:

用户模型是对象2和表 UserRepository是对象2表。 -

如何在控制器中使用模型?我应该静态地还是动态地调用它们

一般规则是:避免OOP中的静态函数。因此:实例化您的模型

$userRepo = new UserRepository();
$result = $userRepo->getSongsOfUser($userId);
这主要是因为静态的东西很难测试。 静态函数是隔离的,您必须将所有依赖项都拉入其中,例如数据库实例。这会导致其他静态函数调用,如Database::getInstance或静态属性访问,这些函数必须在调用之前以某种方式填充。你看,这很快就会变得一团糟。这通常会导致设计糟糕的意大利面代码应用程序,其中过程代码酱与面向对象的面条混合在一起。这样的体系结构很难维护,也很难实现新功能


如果这只是一个爱好项目,那么$result=UserRepository::getSongsOfUser$userId;就足够了。

实际上,控制器没有绑定到数据库。因此,模型中的任何内容都不需要特定于数据库。做另一个MVC框架真的值得投资吗?我掌握了OOP元素。我也希望它成为我的架构,所以是的@markoYou可以在模型中查询用户id,然后根据该id生成查询。然而,这看起来很乏味,就像你自己工作过度一样。这是一个连接可以很好地一次从多个表中获取信息的示例,这听起来像是您正在尝试做的。好的,我只是使用这个示例,因为我觉得我需要从另一个部分访问框架的不同部分@Cracker Tastic如果我理解您正在尝试做什么,也许创建一个会话稳定并在那里存储您需要的内容?使用new在控制器中实例化存储库基本上并不比使用静态方法好多少。控制器仍然与之紧密耦合。他应该使用一个工厂。此外,让控制器获取数据并将其绑定到模板,以及更新模型会破坏SRP。控制器不应该获取数据,这是视图作业。不要走CodeIgniter/CakePHP/OpenCart等方式。他可能会使用工厂。但这是一个设计决策,取决于他试图完成什么。他还可以使用带有自动连接的依赖注入库。但这远远超出了他的要求关于您的语句,控制器不应该获取数据,但是视图应该。这当然有效——但在我看来是错误的。因为视图知道模型并调用存储库方法,对吗?这违反了观点沉默原则。视图根本不应该知道模型。它应该是哑的,只接受数据而不获取数据本身。这个视图哑的原则在哪里陈述?CodeIgniter、CakePHP、OpenCart和所有这些都具有视图静音功能,它导致控制器执行表示层工作,如设置标题、获取数据、选择模板、将数据传递给模板等等。这是严格的视图层工作,那么为什么控制器要这样做呢?如果您现在有一个带有分页的复杂搜索,那么您的控制器将提取所有搜索筛选器,验证它们,计算页面,获取数据,将数据传递给模板等等。这些都是与表示层相关的东西,那么为什么要将其填充到控制器中呢?分页是为了表示的目的,以便更容易查看大型数据集,因此它会进入视图中。视图不是模板,视图是具有方法的对象,就像控制器具有方法一样。模板是哑的是,但视图不是。视图获取自己的数据并将其传递给模板。CI、Cake、OpenCart和更多调用模板视图。我在这些框架中一次又一次地看到它,它们没有真正的视图,只有模板,所以所有的表示层工作都会将内容放入控制器中,最终会变得复杂
d、 “做得太多,主要是破坏了SRP。”延斯·安德烈·科赫说,这是完全错误的。视图不是哑模板。相反,它是负责UI逻辑的MVC triad的一部分。