Проверка маршрута вложенного REST API

У меня есть несколько таких маршрутов:

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, так что не можете использовать привязку модели маршрута? Предполагается, что привязка модели маршрута может иметь проблемы с производительностью?

0

Решение

Вы должны создать 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
}
1

Другие решения

Я бы порекомендовал использовать привязка модели маршрута это проверит идентификатор модели и даст вам соответствующий комментарий или пост-модель.

Таким образом вы извлекаете проверку идентификаторов моделей.

Сейчас я не знаю, как работает ваша модель ответа, но я предполагаю, что это сообщение с атрибутом parent_message_id. Вы можете использовать ту же конечную точку POST, что и комментарий POST /post/1/commentдобавьте необязательный параметр:

'parent_message_id' => 'nullable|exists:comments,parent_message_id'

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector