在构建时无法实例化目标[App \ Interfaces \ IPostRepository]

时间:2018-09-01 08:48:34

标签: php laravel laravel-5.6

我正在尝试在laravel中执行存储库模式,我有很多模型,所以我像下面这样绑定它们

public function register()
{
    $intPath = "App\Interfaces\\";
    // models come from models() method
    foreach ($this->models() as $model) {
        $interface = $intPath."I" . $model . "Repository::class";
        $repoPath = "App\Repositories\\".$model."\\";
        $this->app->singleton($interface, function ($app) use ($model,$repoPath) {
            $cacheName = $repoPath.$model . "CacheRepository";
            $eloquentName = $repoPath.$model . "EloquentRepository";
            return new $cacheName(new $eloquentName);
        });
    }
}

我检查接口和存储库路径,这似乎是正确的。但是仍然给我那个错误

public function __construct(IPostRepository $repository)
{
    $this->post = $repository;
}

我该如何解决?

1 个答案:

答案 0 :(得分:1)

我不知道您为什么使用singleton。如果我在你家,我会走这样的样子:

/**
 * Register any application services.
 *
 * @return void
 */
public function register()
{
    $repositoryFileNames = [
        // Write your RepositoryName here in quotes
    ];

    foreach ($repositoryFileNames as $key => $fileName) {

        // Contracts are interfaces only 
        $this->app->bind(
            "App\\Repositories\\Contracts\\{$fileName}Contract",
            "App\\Repositories\\Classes\\{$fileName}"
        );
    }

}

注意foreach循环内的文件路径。您只使用了1个反斜杠,而我使用了2个。您需要使用相同的斜杠。2个反斜杠,它应该可以解决您的错误。

此外,请注意,我还没有使用singleton方法。相反,我使用了bind方法。