存储库模式 (Laravel) 在模型之间切换

Repository pattern (Laravel) switching beetwen models

我正在 Laravel 使用存储库模式编写应用程序。主要思想是 编写一个存储库来处理基于路由参数的 2 个模型。

所以我的 routes.php 看起来像这样:

Routes.PHP

<?php $api = app('Dingo\Api\Routing\Router');


$api->version('v1', function ($api)
{
    $api->post('create/{type}', ['uses' => 'Beyondi\Account\Http\Controllers\AccountController@insert']);

});

AccountController.php

class AccountController extends Controller
{

    /**
     * Generate JSON Web Token.
     */
    protected $account;

    public function __construct(TypeRepositoryInterface $user)
    {
        $this->account = $user;
    }


    public function insert(AccountRequest $request)
    {
        if($this->account->create($request->input()))
        {
            return $this->response->array("User inserted")->setStatusCode(200);
        }else
        {
            return $this->response->array("Error, user not inserted")->setStatusCode(500);
        }
    }

AccountRequest.php

class AccountRequest extends Request
{
    public function __construct(FormRequest $request)
    {

        if ($request->route('type')=='consumer')
        {
            $rules=[
                'looking_for' => 'required|in:male,female,trans',
                'photo' => 'required',
                'newsletter' => 'boolean|required'
            ];
            $this->rules($rules);
        }else
        {
            $rules=[
                'type' => 'required|in:private,agency',
                'sexuality' => 'required|in:hetero,bi,homo',
                'height' => 'required|numeric'
            ];
            $this->rules($rules);

        }
    }

    public function rules($rules)
    {

        return [$rules];
    }

    public function authorize()
            {
                return true;
            }
        }

TypeRepositoryInterface.php

interface TypeRepositoryInterface
{
    public function create(array $data);

    public function update($id, array $data);

    public function delete($id);

    public function getAll(array $columns = ['*']);

    public function findById($id, $columns = ['*']);

}

AbstractRepository.php

abstract class AbstractRepository implements AbstractRepositoryInterface
{
    protected $model;

    /**
     * Create new repository interface
     *
     * @param Model $model
     */
    public function __construct(Model $model)
    {
        $this->model = $model;
    }

    /**
     * Get new instance of model
     *
     * @param array $attributes
     * @return static
     */
    public function getNew(array $attributes = [])
    {
        return $this->model->newInstance($attributes);
    }

    /**
     * Insert new data in database
     *
     * @param array $data
     * @return static
     */
    public function create(array $data)
    {
        return $this->model->create($data);
    }

    /**
     * Update data in database
     *
     * @param $id
     * @param array $data
     * @return mixed
     */
    public function update($id, array $data)
    {
        return $this->model->whereId($id)->update($data);
    }

    /**
     * Delete data from database
     *
     * @param $id
     * @return bool|null
     * @throws \Exception
     */
    public function delete($id)
    {
        return $this->model->delete($id);
    }

    /**
     * Get all data from database
     *
     * @param array $columns
     * @return \Illuminate\Database\Eloquent\Collection|static[]
     */
    public function getAll(array $columns = ['*'])
    {
        return $this->model->all($columns);
    }

    /**
     * Find data by id
     *
     * @param $id
     * @param array $columns
     * @return \Illuminate\Support\Collection|null|static
     */
    public function findById($id, $columns = ['*'])
    {
        return $this->model->find($id, $columns);
    }


}

TypeRepository.php

class TypeRepository extends AbstractRepository implements TypeRepositoryInterface
{
    protected $model;

    /**
     * Create new repository interface
     *
     * @param Model $model
     */
    public function __construct(ProviderModel $providerModel,ConsumerModel $consumerModel,Request $request, $type)
    {
        if ($request->route('type')=='consumer')
        {
            $this->model = $consumerModel;
        }else
        {
            $this->model = $providerModel;
        }

    }


}

如您所见,我正在尝试根据路由 {type} 参数在 TypeRepository 中的 2 个模型之间切换。但是我得到

Unresolvable dependency resolving [Parameter #3 [ <required> $type ]] in class Account\Repositories\Type\Eloquent\TypeRepository

错误。我错过了什么?如何正确操作?

您没有对 TypeRepository 构造函数的 $type 参数进行类型提示,因此服务容器无法实例化它。

我建议删除 $type 参数并改用它:

$type = $request->input('type');

在你的构造函数中。