【问题标题】:How to autoload multiple classes in Laravel 4 application?如何在 Laravel 4 应用程序中自动加载多个类?
【发布时间】:2014-06-06 20:44:29
【问题描述】:
我在 Laravel 4 中创建了一个工作台包,它是命名空间的并且有两个目录:Models 和 Contexts。不知何故,Laravel 正在我的 Models 目录中加载我的模型(我在那里有一个名为 User 的模型),但是,它不知道我在 Contexts 中的类> 目录。
我希望能够在我的应用程序控制器中使用我的上下文类,而无需指定整个命名空间,所以我想我应该将它们添加到 Laravel 的 IoC 容器中。但是,似乎我需要为我希望添加到容器中的每个类创建一个外观类。如果我有几十个上下文类,这是不可取的,因为这意味着也要创建相同数量的外观类。
在 Laravel 中有没有办法将类批量添加到它的 IoC 容器中?
【问题讨论】:
标签:
laravel
laravel-4
ioc-container
【解决方案1】:
如果你想以 laravel 的方式为你的类使用一个术语门面(例如MyModel::someAction()),那么你必须创建你的门面。但我建议不要为这么多课程这样做。
如果在 contexts 文件夹中找不到您的类,那么您应该检查自动加载条目下的 composer.json 文件或执行 composer dump-autoload -o。
我只是在使用它们的类的构造函数中对类进行 DI,所以你最终会使用 $this->myService->someAction()。
【解决方案2】:
这应该同时回答 Laravel 4 和 5。
首先,您需要使用Illuminate\Foundation\Application类的bind方法,该方法用于在服务容器中注册绑定。在 Laravel 文档中,您会发现很多示例如何做到这一点,但仅限于单个绑定。
如果您查看绑定方法here 的实现或只是定义here,您会注意到此方法接受string|array。这意味着您可以将多个绑定提供为一个数组,并使用它们的完全限定类名将它们全部注册到容器中。像这样的:
$this->app->bind(['\App\Acme\Service1', '\App\Acme\Service2', '\App\Acme\Service3', ...]
考虑到这一点,您可以通过反射轻松获取一个命名空间(目录)中的类,将它们放入数组并使用上述方法注册它们。
【解决方案3】:
一段时间后重新审视这个问题,我认为适当的解决方案是使用我的包的 composer.json 文件自动加载类,然后在控制器和其他类中使用它的 FQN 导入类:
<?php
use Vendor\Package\Contexts\ContextClass;
class Laravel4Controller extends BaseController {
protected $context;
public function __construct(ContextClass $context) {
$this->context = $context;
}
}