我的软件包 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是注入的而不是包中的那个吗?
答案 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);
});
}