Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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模型中实例化DAL对象的最佳实践_Php_Oop_Model View Controller_Dependency Injection_Data Access Layer - Fatal编程技术网

在PHP中实现的MVC模型中实例化DAL对象的最佳实践

在PHP中实现的MVC模型中实例化DAL对象的最佳实践,php,oop,model-view-controller,dependency-injection,data-access-layer,Php,Oop,Model View Controller,Dependency Injection,Data Access Layer,我正在学习流行的MVC,并试图用PHP实现它。我正在设计一个纯OOP风格的框架(尽管我不擅长PHP的OOP功能,我对它的了解还不多)。此框架的示例实现如下图所示 在这个框架中,我添加了一个数据访问层DAL(一个处理连接、执行查询和数据库之间的传输的类),以将物理数据库从系统的其余部分抽象出来,方便更改数据源。如果一个系统仅绑定到一个特定类型的数据库,则该层将仅使用一个对象和一个数据库连接呈现在系统中。该对象将是所有数据映射器对象(即用户映射器、产品映射器)的依赖项 我正在寻找您对在系统中从何处启

我正在学习流行的MVC,并试图用PHP实现它。我正在设计一个纯OOP风格的框架(尽管我不擅长PHP的OOP功能,我对它的了解还不多)。此框架的示例实现如下图所示

在这个框架中,我添加了一个数据访问层DAL(一个处理连接、执行查询和数据库之间的传输的类),以将物理数据库从系统的其余部分抽象出来,方便更改数据源。如果一个系统仅绑定到一个特定类型的数据库,则该层将仅使用一个对象和一个数据库连接呈现在系统中。该对象将是所有数据映射器对象(即用户映射器、产品映射器)的依赖项

我正在寻找您对在系统中从何处启动DAL对象的意见。我可以在前端控制器(index.php)中创建对象,并一直传输到数据映射器对象。但根据和,这是一种反模式。即使出于同样的原因,我们也无法在工厂内启动DAL对象(工厂可以被划分为多个类,以便根据需要处理复杂性)。我不能使用Singleton,因为这也会造成很多问题。那么,在您看来,我可以启动这个对象并将其传递给数据映射器对象的最佳实践和位置是什么


注意:我忽略了这里的视图逻辑,因为我关心的问题与视图没有任何关系。

您需要阅读有关“DI容器”的内容。至于答案:在服务层。。这通常超出了框架的范围。谢谢@tereško,你能告诉我更多关于DI容器逻辑的信息吗?该逻辑将确保DAL对象只有一个实例,并将其传递给多个数据映射器,以满足一个HTTP(s)请求,如果不把它放在全球范围内?这是一个很大的问题,就已经完成的研究和最终目标而言(遗憾的是,这是一个离题的问题)。感谢您所做的大量研究,以及您试图了解事物是如何工作的(我们需要更多的研究!)@tereško是对的,您需要阅读依赖注入。我个人就用这个,看一看。祝你好运@谢谢你的回复。我对骰子框架做了一些研究。由于您熟悉这一点,请您告诉我如何使用骰子来确保在一个生命周期内将所需对象注入多个其他对象,并且注入的对象不是多个实例,而是同一实例。我们如何用骰子做到这一点。@MHRasel您可以研究GitHub上的内部结构。例如,您可以看到
create()
如何检查现有实例,并在其共享时返回该实例。您可以看到共享实例是如何创建的。您需要阅读有关“DI容器”的内容。至于答案:在服务层。。这通常超出了框架的范围。谢谢@tereško,你能告诉我更多关于DI容器逻辑的信息吗?该逻辑将确保DAL对象只有一个实例,并将其传递给多个数据映射器,以满足一个HTTP(s)请求,如果不把它放在全球范围内?这是一个很大的问题,就已经完成的研究和最终目标而言(遗憾的是,这是一个离题的问题)。感谢您所做的大量研究,以及您试图了解事物是如何工作的(我们需要更多的研究!)@tereško是对的,您需要阅读依赖注入。我个人就用这个,看一看。祝你好运@谢谢你的回复。我对骰子框架做了一些研究。由于您熟悉这一点,请您告诉我如何使用骰子来确保在一个生命周期内将所需对象注入多个其他对象,并且注入的对象不是多个实例,而是同一实例。我们如何用骰子做到这一点。@MHRasel您可以研究GitHub上的内部结构。例如,您可以看到
create()
如何检查现有实例,并在其共享时返回该实例。您可以看到共享实例是如何创建的。