У меня есть запрос класса:
class UpdateProductRequest extends ApiRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'name' => 'required',
'description' => 'required',
];
}
}
Но я хочу что-то похожее на:
class UpdateProductRequest extends ApiRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'name'=> [
'name' => 'Product name',
'description' => 'Product name description',
'validation' => 'required',
'type' => 'string',
],
'description'=> [
'name' => 'Product description',
'description' => 'Product description description',
'validation' => 'required',
'type' => 'string',
]
];
}
}
Потому что я хочу использовать эти дополнительные данные для документации по API отдыха. Я не хочу дублировать имена, подобные этой:
class UpdateProductRequest extends ApiRequest
{
public function authorize()
{
return true;
}
public function apiData(){
return [
'name'=> [
'name' => 'Product name',
'description' => 'Product name description',
'type' => 'string',
],
'description'=> [
'name' => 'Product description',
'description' => 'Product description description',
'type' => 'string',
]
];
}
public function rules()
{
return [
'name' => 'required',
'description' => 'required',
];
}
}
Ты можешь сделать rules
использовать свой apiData
как следующие:
class UpdateProductRequest extends ApiRequest
{
public function authorize()
{
return true;
}
public function apiData()
{
return [
'name'=> [
'name' => 'Product name',
'description' => 'Product name description',
'validation' => 'required',
'type' => 'string',
],
'description'=> [
'name' => 'Product description',
'description' => 'Product description description',
'validation' => 'required',
'type' => 'string',
]
];
}
public function rules()
{
return array_map(function($item){
return $item['validation'];
}, $this->apiData());
}
}
Но это может быть хорошей идеей, чтобы посмотреть на развязность для документации. Есть несколько привязок для larave: https://packagist.org/search/?q=swagger%20laravel
РЕДАКТИРОВАТЬ:
rules
это своего рода адаптер для apiData
, который содержит данные. Так что для никогда не упомянутого вопроса вы должны поставить свою логику в apiData
без изменения логики в rules
:
public function apiData()
{
return array_diff_key(
(new Requests\Backend\UpdateProductRequest)->apiData(),
['something' => false]
);
}
public function rules()
{
return array_map(function($item){
return $item['validation'];
}, $this->apiData());
}
Других решений пока нет …