IoC 容器不会在 app/models 中注入扩展 src/models 的新具体 class in composer package

IoC container does not inject the new concrete class in app/models that extends src/models in composer package

我的包裹里有一个 eloquent 型号 Post 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 模型,而不是用户应用程序中的模型,这提供了一个困难的困境,因此我认为存储库模式是一个非常错误的模式,因为它提出的问题多于解决方案。

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

有人会知道一种方法来确保应用程序 Post 模型是注入的模型而不是包中的模型吗?

您的 PostRepository 不知道将在使用它的包中创建的 classes。您显式创建了一个 Entities\Post\Post class 的对象并将其传递给存储库,这就是 Entities\Post\Post 的原因被注入。

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

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