Laravel не вернуть первый возврат - PullRequest
1 голос
/ 09 марта 2020

Когда я расширяю ApiBaseController в другом классе, токен ответа запрещен, это не работает. даже если я поставил неверный токен приложения, но все равно даю ответ в другом классе.

class ApiBaseController extends Controller
{
    protected $user;

    public function __construct()
    {

        if (request()->header('app-token') != 'ofdsafalkhguddskjafl01JhBF9mGx2jay'){
            return response()->json([
                'success'=>false,
                'status'=>'401',
                'message'=>'Token Denied !',
                'response'=>[
                    'total'=>0,
                    'data'=>[]
                ]
            ]);
        }
        else{
            $this->user = Auth::guard('api')->user();
        }
    }
}

Этот класс все еще работает, хотя я поставил неправильный токен приложения

class AttendeesApiController extends ApiBaseController
{
    public function index(Request $request)
    {
        return Attendee::scope($this->account_id)->paginate($request->get('per_page', 25));
    }
}

, который я хочу сделать если неправильный токен приложения даст Token Denied ! ответ, дайте мне совет

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Хотя рекомендуется разделять задачу проверки токена, но не рекомендуется делать это в конструкторе, не говоря уже о том, чтобы скрыть это в конструкторе базового класса.

В Вообще говоря, конструкторы следует использовать для конструирования объекта, а не для «совершения каких-либо действий».

Поскольку вы хотите return на раннем этапе, становится немного сложно извлечь эту проблему из контроллера. Но это то, для чего предназначено промежуточное программное обеспечение.

Посмотрите документацию Laravel по созданию собственного промежуточного программного обеспечения (хотя то, что вы пытаетесь сделать, может быть уже встроено)

Пример класса промежуточного программного обеспечения может выглядеть следующим образом:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckToken
{
    /**
     * Handle an incoming request and check the token.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (...) { //your token check
            return ...; // your early-returned json.
        }

        return $next($request); //otherwise continue
    }
}
0 голосов
/ 09 марта 2020

Вам нужно будет вызвать родительский конструктор, чтобы сделать эту работу.

class AttendeesApiController extends ApiBaseController{
    function __construct(){
      parent::__construct();
    }

    public function index(Request $request){
        return Attendee::scope($this->account_id)->paginate($request->get('per_page', 25));
    }
}

Если я не ошибаюсь, вам также нужно будет поместить объявление типа ie в конструктор, чтобы избежать дальнейшего исполнения.

Обновление:

Лучший способ справиться с этим - сгруппировать эти маршруты в промежуточном программном обеспечении и проверить токен носителя в самом промежуточном программном обеспечении. Это сделает ваш подход более аккуратным, и вы сможете легко добавлять новые маршруты, требующие проверки маркеров канала-носителя в этой группе промежуточного программного обеспечения маршрута.

...