【问题标题】:Laravel not return the first returnLaravel 不返回第一次返回
【发布时间】:2020-06-21 10:02:00
【问题描述】:

当我在另一个类中扩展 ApiBaseController 时,拒绝响应令牌不起作用。即使我输入了错误的 app-token,但仍然在另一个类中给出响应。

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();
        }
    }
}

即使我输入了错误的 app-token,这个类仍然有效

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

我想确保当 app-token 错误时会给出Token Denied ! 响应 请给我一些建议

【问题讨论】:

    标签: php laravel api laravel-5


    【解决方案1】:

    您必须调用父构造函数才能完成这项工作。

    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));
        }
    }
    

    如果我没记错的话,您还必须在构造函数中放置一种骰子以避免进一步执行。

    更新:

    处理此问题的最佳方法是将这些路由分组到中间件中,并在中间件本身中检查不记名令牌。这将使您的方法更加简洁,您可以轻松地在此路由中间件组中添加需要不记名令牌检查的新路由。

    【讨论】:

    • 我尝试使用 parent::__construct();但什么也没发生。仍然来自 AttendeesApiController 的返回
    • @RayCoder echo 响应并在其后添加exit。但请注意,正如我在更新中提到的那样,使用中间件是正确的方法。
    • 退出是什么意思?我只是对使用中间件感到困惑
    • @RayCoder 你能告诉我你的路由文件有这些控制器吗?
    • 否。 当子类的构造函数省略时,不需要调用父构造函数;它会在构造孩子时自动调用。这对于任何方法覆盖都是一样的。您的答案中添加的构造函数什么都不做。此外,您不希望控制器中有任何“die()”。
    【解决方案2】:

    虽然将令牌验证问题分开是个好主意,但在构造函数中做这样的事情并不是一个好习惯,更不用说将它隐藏在基类的构造函数中了。

    一般来说,构造函数应该用来构造对象,而不是“做事”。

    因为你想早点return,所以从控制器中提取这个问题有点复杂。但这就是中间件的用途。

    看看Laravel documentation on creating your own middleware(尽管您尝试做的事情可能已经内置)

    一个示例中间件类可能如下所示:

    <?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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-01
      • 1970-01-01
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多