我用另一个项目模型扩展了我的Laravel4项目。现在我有两个模型(如Model1和Model2)。我的目标是设置自定义配置var,告诉安装使用哪个Project模型。
有没有办法在配置中设置它,然后在我的控制器中使用Project1作为Project?
如果我调用$p = new Project;
,我希望它是Project1或Project2的实例,具体取决于配置。
我希望你理解我的问题,谢谢
答案 0 :(得分:2)
您可以通过使用IoC容器实现此目的。
首先,不要使用new Project
,而是使用App::make('Project')
- 它不会改变任何内容,但会让您现在重新定义'什么'项目'指向。
因此,下一步是,在您的启动脚本(或服务提供商,如果您正在使用服务提供商)代码类似于以下内容:
if (Config::get('model', 'Project') != 'Project') {
App::alias('Project', Config::get('model', 'Project'));
}
此行将绑定您在' model'中设置的任何类名。在主配置中,代码是您在使用App::make('Project')
时检索的内容。 if的原因是我们不会将Project
别名变为Project
。可以随意测试它,但它可能会在IoC中产生无限循环/递归。
代码可能并不完美,因为它未经测试,但至少应该为您提供探索之路。
if
。 IoC容器可能足够聪明,不能继续跟随别名。我之前提到将new Project
的所有实例更改为App::make('Project')
,但我没有提及在使用$projects = Project::all();
之类的内容时如何更改代码。那么你仍然可以做类似的事情,但你只需得到一个实例:App::make('Project')->all();
。
当您开始沿着这条路线行进时,您会发现您需要App::make('Project')
越来越多。在这种情况下,使用Laravel的自动依赖注入将有很大帮助。为此,您需要在控制器的构造函数中键入类:
class ProjectController extends \Controller
{
protected $project;
public function __construct(Project $project)
{
$this->project = $project;
}
public function index()
{
$projects = $this->projects->whereVisible(1)->orderBy('date', 'desc')->get();
return View::make('projects.index', compact('projects'));
}
}
这种自动注射发生在几个类中。我不知道完整列表,但肯定是控制器,事件监听器,视图创建者和视图作曲家。如果你有自己的类,你希望利用自动注入,你可以App::make()
它也可以自动注入它的依赖项。