2017-09-01 2 views
0

J'ai créé une API (magasin) qui enregistre les données sur la base de données et renvoie 201 en cas de succès ou 404 sinon.Laravel 5.4 - forme/API/vue

if ($visit->save()){ 
    $visit->view_visit = [ 
    'href' => 'api/v1/visit/' . $visit->id, 
    'method' => 'GET' 
    ]; 
    $response = [ 
     'msg' => 'Visit created.', 
     'visit' => $visit 
    ]; 
    return response()->json($response, 201); 
} 
$response = [ 
    'msg' => 'Error during creation.' 
    ]; 
return response()->json($response, 404); 

Fonctionne parfaitement. En utilisant postier, vous pouvez voir que le statut sera < 201 Créé >>.

Cette API doit être utilisée de deux manières: appelée par une autre application ou appelée par un formulaire Laravel. C'est la question:

Comment puis-je l'appeler d'une manière si elle réussit, il va charger une vue donnée sur les navigateurs? En d'autres termes, existe-t-il un moyen de rendre le formulaire appel un itinéraire (l'API lui-même, quelque chose comme ../api/visit/) et en cas de succès charge l'autre vue? Aussi, je voudrais passer le contenu de la réponse ['msg'] à cette nouvelle vue.

Je sais que je pourrais le faire à l'intérieur de la méthode magasin en filtrant le référent HTTP, mais je voudrais garder le code du contrôleur strictement pour gérer la création d'enregistrements. En plus de cela, je dois envoyer les codes 201/404 avec les données renvoyées.

J'ai également envisagé de créer un autre contrôleur pour gérer la réponse de l'API, puis d'appeler le formulaire, mais cela semble encore trop - c'est supposé être facile, je suppose.

+0

BTW, le bon code montre 'méthode '=>' POST' au lieu de ' method => « GET' –

+0

vérifier la réponse à – Sletheren

+0

Avoir une regardez https://laravel.com/docs/5.4/redirects#redirecting-with-flashed-session-data –

Répondre

1

En Laravel vous pouvez utiliser une méthode utile qui détermine si la demande qui a été envoyée est une requête AJAX ou tout simplement une demande normale, ce qui est:

$request->wantsJson() 

Ainsi, l'intérieur de votre contrôleur dans la fonction de retour , vous ferez une instruction if:

if ($request->wantsJson()) { 
    return response()->json(); 
}else{ 
    return view(...); 
} 
+0

Merci beaucoup, @Sletheren! Travaillé parfaitement - (je savais qu'il devrait avoir une solution élégante!). Je viens d'ajouter l'en-tête ci-dessous pour la réponse JSON et Laravel a fait sa magie '$ visite-> headers = [ 'Accepter' => 'application/json', 'CONTENT_TYPE' => 'application/json' ]; ' –

+0

heureux je pourrais aider l'homme :) – Sletheren