Проверка маршрута вложенного API REST - PullRequest
0 голосов
/ 11 октября 2018

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

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

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

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

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

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

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

0 голосов
/ 11 октября 2018

Вы должны создать промежуточное программное обеспечение и проверить в нем данные.

Тогда в вашем контроллере верните только те ресурсы, которые вам нужны.

Маршруты:

/**
 * 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...