将所有雄辩模型加载到DI容器中

时间:2016-01-07 07:26:08

标签: php design-patterns

所以我意识到这可能是我曾经遇到的最糟糕的想法,但我对它是否适合反模式并且应该避免,或者是完美的感到非常好奇可接受的解决方案。

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

本练习的主要目的是自动将所有模型添加到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();
        }        
    }
}

所以这里真正的问题基本上是,上面的代码中是否有任何反模式,如果没有这样的反模式,是否有任何真正的安全问题需要担心在实践中使用它成。

1 个答案:

答案 0 :(得分:1)

不,我相信这基本上是很多DI库的工作方式(在java-land中)

然而java / etc会一次读取这些库并将它们存储在内存中... PHP会要求你每次都像这样重新读取目录......所以我认为它是合适的。

唯一的安全问题是允许其他人编写(覆盖)您的DI类。所以,如果你保护那些......我认为你应该没事......

(“想想”,因为我多年没有完成PHP,并且没有跟上安全性最好的SOP)