J'ai donc cherché ici pendant près de 3 heures pourquoi mon code ne fonctionnait pas. Je ne pense pas que ma requête AJAX détecte mon jeton CSRF, même si j'ai essayé de multiples façons de l'implémenter. Je suis novice en matière de requêtes AJAX, alors allez-y doucement.
But : Soumettre une requête POST ajax à /email/subscribe/ et ajouter l'adresse électronique fournie par l'utilisateur au tableau email_subscribers.
J'ai essayé d'ajouter ce qui suit à mon code pour faire apparaître le jeton :
La balise méta et la configuration Ajax.
Haut du dossier
<meta name="csrf-token" content="{{ csrf_token() }}">
Dans la balise script à l'intérieur de la balise jquery $(document).ready()
fonction
// CSRF Ajax Token
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
Champ de saisie caché
J'ai également ajouté un champ de saisie caché et essayé d'insérer le jeton dans l'objet de données dans le post ajax.
HTML
<input type="hidden" id="token" value="{{ csrf_token() }}">
Balise Javascript
var token = $('#token').val();
// var token = $('meta[name="csrf-token"]').attr('content'); //Tried this way
$.ajax({
type: 'POST',
url: '/email/subscribe/',
dataType: 'json',
data: {
email: email,
'_token': token,
// "_token": "{{ csrf_token() }}", //Tried this way as well
"_method": 'POST',
},
success: function (data) {
// Check Server Side validation
if($.isEmptyObject(data.errors)){
console.log(data['success']);
}else{
// Validation Failed Display Error Message
console.log(data.errors);
}
},
error: function (data) {
console.log(data);
}
}); // End Ajax POST function
Voici mon web.php fichier
// Email Routes
Route::prefix('email')->group(function() {
// Create Post Route for subscribing
Route::post('/subscribe', 'EmailSubscriptionsController@subscribe')->name('email.subscribe');
});
et mon Contrôleur d'abonnements par courriel
class EmailSubscriptionsController extends Controller
{
// Store the Email into the database
public function subscribe(Request $request) {
// Validate the request
$validator = Validator::make($request->all(), [
'email' => 'required|email',
]);
// If the validation fails
if($validator->fails()) {
return response()->json([
'errors' => $validator->errors()->all(),
]);
}
// New Section Object
$subscription = new EmailSubscription;
// Add Name into Section Object
$subscription->email = $request->email;
// Save the Section
$subscription->save();
// Return The Request
return response()->json([
'success' => 'Record has been saved successfully!'
]);
} // End Subscribe
} // End Controller
Ce qui est vraiment bizarre, c'est que lorsque je soumets la demande avec RIEN d'autre que ce qui suit dans mon subscribe()
dans mon contrôleur :
// Return The Request
return response()->json([
'success' => 'Record has been saved successfully!'
]);
Il ne renvoie pas d'erreur.... Il transmet simplement le message de réussite à la console. Je ne suis pas sûr de savoir ce que je fais de travers car j'ai réussi à faire fonctionner cela (une requête post ajax) dans une autre partie de mon site.