IoC容器不会在扩展应用程序包中的src / models的app / models中注入新的具体类

时间:2015-08-08 09:30:10

标签: php laravel laravel-5 ioc-container

我的软件包 rowland / laravelblog 中有一个雄辩的模型 发布 ,它使用了存储库模式。它有一些默认实现,但我希望我的包的用户在他自己的应用程序中扩展此模型Post。但是,由于我使用的是存储库模式,这是我的 PostServiceProvider

    <?php  

namespace Repositories\Post;

use Illuminate\Support\ServiceProvider;
use Repositories\Post\PostRepository;
use Entities\Post\Post;

/**
* Register our Repository with Laravel
*/
class PostServiceProvider extends ServiceProvider {

     public function register() {

        // Bind the returned class to the namespace 'Repository\Post\IPostRepository'
        $this->app->bind('Repositories\Post\IPostRepository', function($app)
        {
            return new PostRepository(new Post());
        });

    }

我的问题是,当用户安装此软件包并扩展我的Post模型时,如下所示

<?php

namespace Entities\Post;

class Post extends Entities\Post\Post {

    /**
     * Defines the belongsToMany relationship between Post and Category
     *
     * @return mixed
     */
    public function categories()
    {
        return $this->belongsToMany('Fbf\LaravelCategories\Category', 'category_post');
    }
}

laravel IoC容器解析了我的软件包中的Post Model而不是用户应用程序中的Post Model,这提供了一个困难的困境,因此我认为存储库模式是一种非常错误的模式,因为它提出了比解决方案更多的问题

修改 我知道它会在包中注入Post模型,因为用户无法访问应用程序Post模型中的自定义方法,例如用户无法调用$post->categories()

有人知道如何确保应用程序Post Model是注入的而不是包中的那个吗?

1 个答案:

答案 0 :(得分:1)

您的 PostRepository 并不知道将在使用它的包中创建的类。您明确创建 Entities \ Post \ Post 类的对象并将其传递给存储库,这就是注入 Entities \ Post \ Post 的原因。

为了使您能够正常工作,您需要让其他软件包配置您的服务提供商。最简单的方法是在配置文件中放置要使用的类的名称,并在实例化存储库时从配置中使用类名。

public function register() {
  $this->app->bind('Repositories\Post\IPostRepository', function($app) {
    $model = $this->app['config']['app.post_model'];
    return new PostRepository(new $model);
  });
}