存储库模式 (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');
在你的构造函数中。
我正在 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');
在你的构造函数中。