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);
});
}
我的包裹里有一个 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);
});
}