首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >库房注射

库房注射
EN

Stack Overflow用户
提问于 2015-02-15 05:47:37
回答 1查看 353关注 0票数 0

我发现了许多关于我的问题的问题,并尝试(我认为)所有的解决方案,但我无法使它发挥作用。我可能忽略了一些很简单的东西。

我正在使用Laravel 5,我尝试实现一个存储库模式。我有一位雄辩的模特“\Notos\ an”。

然后我有了这个界面:

代码语言:javascript
复制
namespace Notos\Contracts;

interface Kind
{
    public function findByName($name);
}

我的仓库看起来是这样的:

代码语言:javascript
复制
namespace Notos\Repository;


use Illuminate\Database\Eloquent\Model;
use Notos\Contracts\Kind as KindContract;

class Kind implements KindContract
{
    protected $kind;

    public function __construct(Model $kind)
    {
        $this->kind = $kind;
    }

    public function findByName($name)
    {
        return $this->kind->firstOrCreate(array('name' => $name));
    }
}

我的ServiceProvider:

代码语言:javascript
复制
namespace Notos\Providers;

use Illuminate\Support\ServiceProvider;
use Notos\Kind;
use Notos\Repository\Kind as KindRepository;


class RepoServiceProvider extends ServiceProvider
{

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('Notos\Contracts\Kind', function ($app) {
            return new KindRepository(new Kind);
        });
    }
}

以及我使用存储库的控制器:

代码语言:javascript
复制
namespace Notos\Http\Controllers;

use Notos\Repository\Kind as KindRepository;

class KindController extends Controller
{
    protected $kind;

    public function __construct(KindRepository $kind)
    {
        $this->kind = $kind;
    }

    public function find($name)
    {
        return $this->kind->findByName($name);
    }
}

此提供程序在config/app.php中注册。

当我尝试执行KindController@find时,我得到了以下错误:

代码语言:javascript
复制
BindingResolutionException in Container.php line 785:
Target [Illuminate\Database\Eloquent\Model] is not instantiable.

我找不到我做错了什么。如果我将__construct(Model $kind)更改为__construct(__construct $kind),它就会非常完美。

有什么想法吗?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-15 09:43:32

首先,我建议您将函数添加到类名中,因此,例如,使用Kind代替存储库使用KindRepository,对于契约也是如此。否则,您将有3种类(当然是在不同的名称空间中),但是很难分析代码。

这里的问题是,在您的KindController中,您尝试直接注入KindRepository,但是在构造函数中使用Model。它不能工作,因为Model只是抽象类。你该怎么做才能让它发挥作用?

在守则中:

代码语言:javascript
复制
$this->app->bind('Notos\Contracts\Kind', function ($app) {
            return new KindRepository(new Kind);
        });

您告诉Laravel,当您使用Notos\Contracts\Kind时,它应该使用构造函数中的Kind为您创建KindRepository --听着,这里讲的是契约,而不是存储库本身。

因此,要使它正常工作,您应该在控制器中使用,而不是在存储库中使用,而是在契约中使用。

而不是行:

代码语言:javascript
复制
use Notos\Repository\Kind as KindRepository;

你应该写:

代码语言:javascript
复制
use Notos\Contracts\Kind as KindRepository;

现在应该管用了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28523400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档