Laravel4:根据配置使用不同的型号

时间:2014-03-17 11:25:04

标签: php laravel laravel-4

我用另一个项目模型扩展了我的Laravel4项目。现在我有两个模型(如Model1和Model2)。我的目标是设置自定义配置var,告诉安装使用哪个Project模型。

有没有办法在配置中设置它,然后在我的控制器中使用Project1作为Project? 如果我调用$p = new Project;,我希望它是Project1或Project2的实例,具体取决于配置。

我希望你理解我的问题,谢谢

1 个答案:

答案 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中产生无限循环/递归。

代码可能并不完美,因为它未经测试,但至少应该为您提供探索之路。


注意事项

  • 你可能会发现App :: bind(' project',Config :: get(' model'));效果更好,特别是如果你开始使用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()它也可以自动注入它的依赖项。