2017-09-23 6 views
1

J'ai une telle voie dans mes voies/web.phpLaravel 5.5 Demande est vide dans le contrôleur Restful

Route::resource('/api/surveys', 'SurveyController'); 

Comme dit la documentation, il crée toutes les voies nécessaires pour l'API. Cette fonction, qui est exécuté quand je vais pour/api itinéraire/enquêtes: si oui,

public function index() 
{ 

    $request = request(); 

    if(!$request->hasHeader('token')) { 

     return "No auth token found."; 
    } 

    $tokenCheck = $this->userService->isTokenValid($request->header('token')); 

    if($tokenCheck !== true) { 

     return $tokenCheck; 

    } 

    return $this->surveyService->all(); 
} 

Ce qu'il fait, il vérifie si le paramètre d'en-tête jeton est défini, sinon, elle renvoie une erreur, vérifie si le jeton est valide et etc. si tout est OK, il doit renvoyer les enquêtes de la base de données.

public function surveys() { 

    $request = \Request::create('/api/surveys', 'GET'); 
    $request->headers->set('Accept', 'application/json'); 
    $request->headers->set('token', \Cookie::get('token')); 
    $response = \Route::dispatch($request); 

    print_r('<pre>'); 
    print_r($response); 
    print_r('</pre>'); 

} 

J'ai un site Web, qui devrait utiliser cette API que je viens de créer pour obtenir tous les enregistrements d'enquête. Je crée un nouvel objet de requête, définissez l'en-tête "token" avec le jeton que je reçois d'un cookie, puis j'essaie de l'envoyer et d'obtenir une réponse. Mais le problème est que chaque fois que je reçois "Aucun jeton d'authentification trouvé." Erreur. Cela signifie que $ request-> hasHeader ('token') renvoie false, même si je l'ai défini ici dans ma requête. Si j'imprime $ request-> all() dans Restful controller, j'obtiens un tableau vide.

J'ai essayé Postman d'accéder à cette API avec un paramètre de jeton, et cela fonctionne très bien dans le facteur, mais ici, il semble que la requête disparaisse pendant qu'elle se déplace vers le contrôleur API.

Qu'est-ce que j'ai fait de mal ici?

+0

Obtient l'objet de requête en tant que paramètre dans la fonction d'index. – Amin

+0

J'ai essayé, mais ça ne marche pas non plus. – cinik11

+0

[Voir ceci] (https://stackoverflow.com/questions/23505875/laravel-routeresource-vs-routecontroller). – Amin

Répondre

0

Lorsque vous créez manuellement une demande et l'expédiez, cela fonctionne pour que le routage appelle le bon contrôleur, mais cela n'affecte pas la requête qui est liée dans le conteneur.

Lorsque votre demande "fausse" est gérée par le contrôleur api, la demande qu'elle retire du conteneur est la requête "réelle" d'origine qui a été faite par l'utilisateur. Au lieu d'envoyer l'itinéraire avec votre nouvelle demande, vous devrez app()->handle($request) la nouvelle demande. Ceci, cependant, remplacera complètement la demande "réelle" originale avec votre nouvelle demande "fausse", ainsi tout sera perdu de la demande originale. Après avoir dit tout cela, cette méthode de consommation de votre propre api est découragée, même par Taylor. Vous pouvez lire son commentaire sur this Github issue. Donc, consommer votre propre API comme ça peut fonctionner, mais vous pouvez également rencontrer d'autres problèmes imprévus.

La solution la plus appropriée serait d'extraire la logique appelée par les routes API vers une autre classe, puis d'appeler cette logique extraite à la fois de vos routes API et de vos routes web.

+0

Pouvez-vous me donner plus d'informations sur cette solution appropriée? Merci. – cinik11