有趣的问题。我做了一些修补,但我不知道这是你想要的。但是您可以动态创建存储库类所需的Eloquent模型实例。
比方说,你必须存储在app\Models\User.php
您User
模型类:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
//
}
然后,您创建一个抽象基类所有的仓库类:app\Repositories\BaseRepository.php
。这是您放置存储库类的所有常用功能的地方。但不是通过构造函数注入Eloquent实例,而是添加一个名为getModel()
的方法来动态创建存储库的Eloquent模型实例。
<?php
namespace App\Repositories;
use ReflectionClass;
use RuntimeException;
use Illuminate\Support\Str;
abstract class BaseRepository
{
protected $modelNamespace = 'App\\Models\\';
public function getById($id)
{
return $this->getModel()->find($id);
}
public function getModel()
{
$repositoryClassName = (new ReflectionClass($this))->getShortName();
$modelRepositoryClassName = $this->modelNamespace . Str::replaceLast('Repository', '', $repositoryClassName);
if (! class_exists($modelRepositoryClassName)) {
throw new RuntimeException("Class {$modelRepositoryClassName} does not exists.");
}
return new $modelRepositoryClassName;
}
}
现在让我们假设你想创建一个信息库用于User
模型,并且这个用户的库必须实现以下接口:app\Repositories\UserRepositoryInterface.php
<?php
namespace App\Repositories;
interface UserRepositoryInterface
{
public function getByEmail($email);
}
创建app\Repositories\UserRepository.php
类,并简单地从BaseRepository
扩展它类。另外不要忘记实施在UserRepositoryInterface
上定义的所有特定实现。
<?php
namespace App\Repositories;
use App\Repositories\BaseRepository;
use App\Repositories\UserRepositoryInterface;
class UserRepository extends BaseRepository implements UserRepositoryInterface
{
public function getByEmail($email)
{
return $this->getModel()->where('email', $email)->firstOrFail();
}
}
这样你就可以绑定UserRepositoryInterface
它是像这样实现:
$this->app->bind(\App\Repositories\UserRepositoryInterface::class, \App\Repositories\UserRepository::class);
最后,你可以自由地注入UserRepositoryInterface
到控制器的构造函数或方法。您还可以通过服务容器解决这样的:
$userRepository = App::make(App\Repositories\UserRepositoryInterface::class);
$userRepository->getByEmail('[email protected]');
当然,这里有一个问题,以这种方式。存储库类应以相关模型启动,因此InvoiceRepository.php
专用于Invoice.php
模型类。
希望得到这个帮助!
您可以从中得到启发这个http://meanderingsoul.com/dev/2015/04/dependency-injection-with-inherited-controllers-in-laravel-5 –
或者也许只是从ExampleRepository类中移除构造函数,除非调用父构造函数,否则没有其他要做的事情。 –
@MateuszDrost我没有输入,但还有更多的事情要做。每个存储库都有自己的依赖关系(通常只是雄辩模型,因为我不喜欢滥用外观)。 – user2430929