我很高兴" Advanced Laravel"可以这么说,但是我知道大部分的基础知识,而且我正在努力了解命名空间,接口和存储库是什么,因为我不久前遇到过它。
但是,我收到以下错误,我不知道我做错了什么:
类app \ models \ Interfaces \ CategoriesInterface不存在
以下是我的代码:
routes.php文件
App::bind('App\Models\Interfaces\BaseInterface', 'App\Models\Repositories\BaseRepository');
CategoriesController.php
<?php
use app\models\Interfaces\CategoriesInterface;
class CategoriesController extends BaseController
{
protected $categories;
public function __construct(CategoriesInterface $categories)
{
$this->categories = $categories;
}
BaseInterface.php
<?php
interface BaseInterface
{
public function all();
}
CategoriesInterface.php
<?php namespace App\Models\Interfaces;
interface CategoriesInterface extends BaseInterface { }
CategoriesRepository.php
<?php namespace app\models\Repositories;
use App\Models\Interfaces\CategoriesInterface;
use Categories;
class CategoriesRepository implements CategoriesInterface
{
public function all()
{
$categories = $this->categories->all();
return $categories;
}
}
EloquentCategoriesRepository.php
<?php namespace app\models\Repositories;
use App\Models\Interfaces\CategoriesInterface;
class EloquentCategoriesRepository implements CategoriesInterface {
public function all()
{
return Categories::all();
}
答案 0 :(得分:1)
尝试正确地对类/接口进行名称间隔。 EloquentCategoriesRepository.php
和CategoriesRepository
在命名空间中有app
而不是App
。 CategoriesController
也需要使用App\..
而不是app\..
。
答案 1 :(得分:0)
我看到你正在尝试实现存储库模式,起初它可能看起来有点“先进”。但实际上非常简单。
因此,基本思想是使用数据库抽象应用程序的数据层,以便从一个DBS转换到另一个DBS(例如,Mysql到Mongo)。
换句话说,您正在尝试使应用程序的业务逻辑独立于数据层(查询集合/实例的位置),因此当您达到可能要更改数据库的点时,您可以实现另一个仓库。接口用于在您的应用程序和数据层之间提供合同。
Laravel实施存储库模式非常直接。
App::bind
)请勿忘记使用psr-04
自动加载命名空间。
在您的情况下,我认为问题是您没有自动加载命名空间。
另外CategoriesRepository.php
&amp; EloquentCategoriesRepository.php
都是Eloquent存储库,将返回Eloquent集合。要返回stdClass
(标准PDO)数组,您必须使用\DB
外观。
如果我的回答不适合您,请查看here