2014-04-01 134 views
0

我建立了一個過濾器,它檢查一些鍵和ID發送,然後給出去或不去。問題是Laravel中的過濾器應該返回一個字符串,而我只是想返回一個布爾值並讓它觸發預期的路線。過濾器後Laravel觸發路由

篩選:

Route::filter('api_checkauth', function($route) 
{ 
    //user"ok" 
    $user_id = (int) $route->getParameter('user_id'); 

    $sig = $route->getParameter('sig'); 

    $user = User::find($user_id); 

    if($user) { 
     //user email 
     $email = $user->email; 
     //user api key 
     $api_key = $user->api_key; 
     //recreate signature 

     $_sig = hash_hmac("sha256", $email . $user_id, $api_key); 

     if($_sig === $sig) { 
      return Response::json(array("message"=>"Request Ok"),200); 
     } else { 
      return Response::json(array("message"=>"Request Bad"),400); 
     } 
    } else { 
     return Response::json(array("message"=>"Request not authorized"),401); 
    } 

}); 

路線:

// Route group for API versioning 
Route::group(array('prefix' => 'api/v1', 'before' => 'api_checkauth'), function() 
{ 

    Route::get('/pim/{user_id}/{sig}', '[email protected]'); 
}); 

因此問題是,我怎麼能依舊會觸發我的組中定義的路線?因爲現在發生的事情是隻打印一條消息,而不是應該觸發的控制器方法。

由於

回答

1

在Laravel,如果過濾器返回一個響應,該響應被認爲是對請求的響應,並且不執行的路由。因此,只有當用戶沒有被授權時,爲了執行路由纔會返回響應。

if($user) { 

    $email = $user->email; 

    $api_key = $user->api_key; 

    $_sig = hash_hmac("sha256", $email . $user_id, $api_key); 

    if($_sig !== $sig) { 

    return Response::json(array("message"=>"Request Bad"),400); 
    } 

} else { 

    return Response::json(array("message"=>"Request not authorized"),401); 
} 
+0

謝謝!你的答案有點模糊,但我理解它。 –

1

答案是,你在錯誤的地方返回你的200 HTTP響應。

正如您所述,由於if/else語句的結構,無論發生什麼情況,您都將始終從過濾器獲取JSON字符串響應。

而不是在過濾器中返回您的200響應,處理您的MoreOrLessController @ index操作。所以,爲了澄清,*確認$ _sig === $ sig *時,不要在過濾器中返回ANYTHING。

這應該做到這一點!