Laravel中的错误函数参数太少

时间:2020-05-23 18:10:40

标签: php laravel laravel-5 caching laravel-7

我是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
        );
    }

代码运行没有问题。

我该如何修理?

请帮助我。

1 个答案:

答案 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;
}