Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.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 将所有有说服力的模型加载到DI容器中_Php_Design Patterns - Fatal编程技术网

Php 将所有有说服力的模型加载到DI容器中

Php 将所有有说服力的模型加载到DI容器中,php,design-patterns,Php,Design Patterns,所以我意识到这可能是我有过的最糟糕的想法,但我非常好奇它是否符合反模式,应该避免,或者是一个完全可以接受的解决方案 在我的测试用例中,我将使用Eloquent和Pimple,但是我不相信它们是相关的,只要您有一个DI容器和一个使用类似模型类的ORM。我还使用PSR4命名对文件结构进行假设 本练习的主要目标是自动将所有模型添加到DI容器中,而无需实际包含和创建类的实例,这样您就可以轻松地在DI容器中手动定义它 我在下面提供的示例代码跳过了一些精细的检查,例如确保有一个无参数构造函数,确保它尚未在容

所以我意识到这可能是我有过的最糟糕的想法,但我非常好奇它是否符合反模式,应该避免,或者是一个完全可以接受的解决方案

在我的测试用例中,我将使用Eloquent和Pimple,但是我不相信它们是相关的,只要您有一个DI容器和一个使用类似模型类的ORM。我还使用PSR4命名对文件结构进行假设

本练习的主要目标是自动将所有模型添加到DI容器中,而无需实际包含和创建类的实例,这样您就可以轻松地在DI容器中手动定义它

我在下面提供的示例代码跳过了一些精细的检查,例如确保有一个无参数构造函数,确保它尚未在容器中定义,等等

$container = new Container(); // DI Container
$directory = new RecursiveDirectoryIterator("/path/to/models");
$iterator = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $class) {
    if ($class->isFile() && $class->getExtensions() == "php") {
        $filename = $class->getBasename(".php");
        $container[$filename] = function() use ($class, $filename) {
            $classname = "\\Fully\\Qualified\\Namespace\\{$filename}";
            require_once $class;
            return new $classname();
        }        
    }
}

因此,这里真正的问题本质上是,上述代码中是否存在任何反模式,如果没有适合的反模式,在实践中使用它是否存在任何真正的安全问题。

不,我相信很多DI库基本上就是这样工作的(在java领域)

但是java/etc会一次性读取库并将它们存储在内存中。。。PHP将要求您每次都像这样从目录中重新读取。。。因此,我认为这是适当的

唯一的安全问题是允许其他人写入(重写)您的DI类。所以如果你保护那些。。。我觉得你应该没事


(“Think”因为我已经多年没有做过PHP了,也没有跟上那里最好的安全SOP)

这个解决方案的目标之一是确保文件只从闭包中读取,这意味着在加载UserModel.PHP的内容之前,需要调用
$container->get(“UserModel”)
,大概使用超级闭包之类的东西,您可以将闭包缓存到磁盘/内存中,从而提高性能。。。