如何在Laravel 4应用程序中自动加载多个类?

时间:2014-04-22 12:53:18

标签: laravel laravel-4 ioc-container

我在Laravel 4中创建了一个工作台包,它是名称间隔的,有两个目录:模型上下文。不知怎的,Laravel正在我的 Models 目录中加载我的模型(我在那里有一个名为User的模型)但是,它不知道我在上下文中的类< / strong>目录。

我希望能够在我的app控制器中使用我的上下文类而不指定整个命名空间,所以我想我会将它们添加到Laravel的IoC容器中。但是,我似乎需要为每个要添加到容器的类创建一个façade类。如果我有几十个上下文类,这是不可取的,因为它也意味着创建相同数量的外观类。

Laravel有没有办法将类批量添加到其IoC容器中?

3 个答案:

答案 0 :(得分:0)

如果你想为你的课程使用一个术语外墙(例如MyModel::someAction()),那么你必须创建你的外墙。但我建议不要为这么多课程这样做。

如果找不到上下文文件夹中的类,则应检查自动加载条目下的composer.json文件或执行composer dump-autoload -o

我只是修改使用它们的类的构造函数中的类,因此最终使用$this->myService->someAction()

答案 1 :(得分:0)

这应该回答Laravel 4和5。

首先,您需要使用bind方法Illuminate\Foundation\Application类,该类用于在服务容器中注册绑定。在Laravel文档中,您将找到大量示例,如何执行此操作,但仅适用于单个绑定。

如果您查看绑定方法here或仅定义here的实现,您会注意到此方法接受string|array。这意味着您可以提供多个绑定作为数组,并使用其完全限定的类名称在容器中注册所有绑定。像这样:

$this->app->bind(['\App\Acme\Service1', '\App\Acme\Service2', '\App\Acme\Service3', ...]

考虑到这一点,您可以轻松地使用反射在一个命名空间(目录)中获取类,将它们放在数组中并使用上面的方法来注册它们。

答案 2 :(得分:0)

稍后重新审视这个问题,我认为适当的解决方案是使用我的包的 composer.json 文件自动加载类,然后在控制器和其他类中使用它的FQN导入类: / p>

<?php

use Vendor\Package\Contexts\ContextClass;

class Laravel4Controller extends BaseController {

    protected $context;

    public function __construct(ContextClass $context) {
        $this->context = $context;
    }

}