У меня есть несколько таких маршрутов:
GET /post/1/comment/1
PUT /post/1/comment/1
POST /post/1/comment/1/reply
Проверка для post_id & comment_id для каждого API в контроллерах создаст много дублирующегося кода.
Например:
CommentsController
function getInfo($postId, $commentId)
{
// validate postId
// validate commentId
// find & return Comment
}
function update(UpdateRequest $request, $postId, $commentId)
{
// validate postId
// validate commentId
// update Comment
}
function reply(CreateReplyRequest $request, $postId, $commentId)
{
// validate postId
// validate commentId
// create reply for Comment
}
Что нужно сделать, чтобы уменьшить дублирование кода? Каковы лучшие практики?
ОБНОВЛЕНИЕ 1:
Это в Lumen, так что не можете использовать привязку модели маршрута? Предполагается, что привязка модели маршрута может иметь проблемы с производительностью?
Вы должны создать Middleware и проверить данные в нем.
Тогда в ваш контроллер возвращайте только те ресурсы, которые вы хотите.
Маршруты:
/**
* Authentification & validation middleware API Version 1
**/
Route::group(['middleware' => ['auth.api.v1']], function()
{
Route::get('infos/{postId}/{commentId}', '...Controller@getInfo');
[...]
});
В вашем промежуточном программном обеспечении:
<?php
namespace App\Http\Middleware\API\V1;
use Closure;
use Validator;
use Input;
use Log;
class Authenticate
{
/**
* Handle an incoming request and format data request
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// Validating $request
$rules = [
'data' => ['required'],
[...]
];
$validator = Validator::make(Input::all(), $rules);
if ($validator->fails())
{
Log::debug($validator->messages());
abort(403, 'Forbidden');
}
[...]
return $next($request);
}
}
В вашем контроллере:
function getInfo($postId, $commentId)
{
// find & return Comment
}
Я бы порекомендовал использовать привязка модели маршрута это проверит идентификатор модели и даст вам соответствующий комментарий или пост-модель.
Таким образом вы извлекаете проверку идентификаторов моделей.
Сейчас я не знаю, как работает ваша модель ответа, но я предполагаю, что это сообщение с атрибутом parent_message_id. Вы можете использовать ту же конечную точку POST, что и комментарий POST /post/1/comment
добавьте необязательный параметр:
'parent_message_id' => 'nullable|exists:comments,parent_message_id'