我是php和Laravel的初学者。我在我的项目Laravel 7中使用。 我的项目中有带有缓存的存储库模式。
PageServiceProvider:
public function register()
{
$this->app->bind(PageRepositoryInterface::class, function ($app) {
return new CachingPageRepository(
new PageRepository
);
});
}
public function provides()
{
return [
PageRepositoryInterface::class,
];
}
CachingBaseRepository:
abstract class CachingBaseRepository implements RepositoryInterface
{
use ScopeActiveTrait;
protected $model;
public function all()
{
return Cache::remember($this->model.'.all', $minutes = 10, function () {
return $this->model->get();
});
}
public function allEnables()
{
return Cache::remember($this->model.'.enables', $minutes = 10, function () {
return $this->model->active()->get();
});
}
public function list(string $orderByColumn, string $orderBy = 'desc', array $with = [])
{
return Cache::remember($this->model.'.list', $minutes = 10, function () use($with, $orderByColumn, $orderBy) {
return $this->model->with($with)
->orderBy($orderByColumn, $orderBy)
->get();
});
}
public function listWithPaginate(string $orderByColumn, string $orderBy = 'desc', array $with = [], int $perPage = 10)
{
return Cache::remember($this->model.'.listWithPaginate', $minutes = 10, function () use($with, $orderByColumn, $orderBy, $perPage) {
return $this->model->with($with)
->orderBy($orderByColumn, $orderBy)
->paginate($perPage)->appends(request()->query());
});
}
public function create(array $data): int
{
return $this->model->create($data)->id;
// delete cache: all, enables, list, listWithPaginate
}
public function update(array $data, int $id, string $attribute = 'id'): void
{
$this->model->where($attribute, '=', $id)->update($data);
// delete cache: all, enables, list, listWithPaginate
}
public function delete(int $id): void
{
$this->model->destroy($id);
// delete cache: all, enables, list, listWithPaginate
}
public function find(int $id)
{
return Cache::remember($this->model.".{$id}", $minutes = 60, function () use ($id) {
return $this->model->find($id);
});
}
public function getModel()
{
return Cache::remember($this->model.".all", $minutes = 60, function (){
return $this->model;
});
}
public function getFirst(int $id)
{
return Cache::remember($this->model.".{$id}", $minutes = 60, function () use ($id) {
return $this->model->where('id', $id)->first();
});
}
public function findOrFail(int $id)
{
return Cache::remember($this->model.".{$id}", $minutes = 60, function () use ($id) {
return $this->model->findOrFail($id);
});
}
}
BaseRepository:
abstract class BaseRepository implements RepositoryInterface
{
use ScopeActiveTrait;
protected $model;
public function all()
{
return $this->model->get();
}
public function allEnables()
{
return $this->model->active()->get();
}
public function list(string $orderByColumn, string $orderBy = 'desc', array $with = [])
{
return $this->model->with($with)
->orderBy($orderByColumn, $orderBy)
->get();
}
public function listWithPaginate(string $orderByColumn, string $orderBy = 'desc', array $with = [], int $perPage = 10)
{
return $this->model->with($with)
->orderBy($orderByColumn, $orderBy)
->paginate($perPage)->appends(request()->query());
}
public function create(array $data): int
{
return $this->model->create($data)->id;
}
public function update(array $data, int $id, string $attribute = 'id'): void
{
$this->model->where($attribute, '=', $id)->update($data);
}
public function delete(int $id): void
{
$this->model->destroy($id);
}
public function find(int $id)
{
return $this->model->find($id);
}
public function getModel()
{
return $this->model;
}
public function getFirst(int $id)
{
return $this->model->where('id', $id)->first();
}
public function findOrFail(int $id)
{
return $this->model->findOrFail($id);
}
}
PageRepository:
class PageRepository extends BaseRepository implements PageRepositoryInterface
{
public function __construct(Page $model)
{
$this->model = $model;
}
public function search(string $query, string $orderByColumn, string $orderBy = 'desc', array $with = [], int $perPage = 10)
{
return $this->model->where('title', 'LIKE', '%' . $query . '%')->orWhere('description', 'LIKE', '%' . $query . '%')->orWhere('keywords', 'LIKE', '%' . $query . '%')->orWhere('content', 'LIKE', '%' . $query . '%')->with($with)->orderBy($orderByColumn, $orderBy)->paginate($perPage)->appends(request()->query());
}
public function getTextPageFromSlug(string $slug)
{
return $this->model->active()->where('slug', $slug)->first();
}
}
CachingPageRepository
class CachingPageRepository extends CachingBaseRepository implements PageRepositoryInterface
{
public function __construct(Page $model)
{
$this->model = $model;
}
public function search(string $query, string $orderByColumn, string $orderBy = 'desc', array $with = [], int $perPage = 10)
{
return Cache::remember('page.all', $minutes = 10, function () use($query, $orderByColumn, $with, $orderBy, $perPage) {
return $this->model->where('title', 'LIKE', '%' . $query . '%')->orWhere('description', 'LIKE', '%' . $query . '%')->orWhere('keywords', 'LIKE', '%' . $query . '%')->orWhere('content', 'LIKE', '%' . $query . '%')->with($with)->orderBy($orderByColumn, $orderBy)->paginate($perPage)->appends(request()->query());
});
}
public function getTextPageFromSlug(string $slug)
{
return Cache::remember("users.{$slug}", $minutes = 60, function () use ($slug) {
return $this->model->active()->where('slug', $slug)->first();
});
}
}
PageRepositoryInterface:
interface PageRepositoryInterface extends RepositoryInterface
{
public function search(string $query, string $orderByColumn, string $orderBy = 'desc', array $with = [], int $perPage = 30);
public function getTextPageFromSlug(string $slug);
}
我想在上面的代码中向我的网站添加缓存。我的控制器如下所示:
protected $model;
public function __construct(PageRepositoryInterface $repository)
{
$this->model = $repository;
}
public function index(Request $request)
{
if ($request->input('query') != "") {
$pages = $this->model->search($request->input('query'), 'id', 'asc', [], 30);
} else {
$pages = $this->model->listWithPaginate('id', 'desc', [], 30);
}
return view('admin.pages.list', ['pages' => $pages]);
}
运行上面的代码时出现错误:
ArgumentCountError函数参数太少 App \ Repositories \ PageRepository :: __ construct(),传入0 /var/www/app/Providers/PageServiceProvider.php在第22行以及 预期1个
以前,当我在页面上没有缓存时,我的PageServiceProvider看起来像这样:
public function register()
{
$this->app->bind(
PageRepositoryInterface::class,
PageRepository::class
);
}
代码运行没有问题。
我该如何修理?
请帮助我。
答案 0 :(得分:2)
在PageRepository中的_construct中,您的$ model是一个Page。构造函数需要模型/页面来实例化新的PageRepository:
public function register()
{
$this->app->bind(PageRepositoryInterface::class, function ($app) {
return new CachingPageRepository(
new PageRepository(new Page()) //constructor for PageRepository needs a model
);
});
}
public function provides()
{
return [
PageRepositoryInterface::class,
];
我在其中放置了“ new Page()”,但我真的无法告诉您从何处获取新的页面实例。但是,从构造函数中很明显,您需要在其中输入Page的实例:
public function __construct(Page $model)
{
$this->model = $model;
}