Laravel 5 + AngularJS Croix Domaine de la SCRO
J'ai cherché partout pour une réponse, mais rien ne fonctionnait. Tous les solutions sur la pile ne se sont pas avérées suffisantes.
Je ne reçois rien dans ma laravel formulaire d'identification des erreurs et je ne reçois que la norme:
XMLHttpRequest cannot load http://api.domain.dev/post/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://domain.dev' is therefore not allowed access.
Laravel contrôleur:
<?php namespace App\Http\Controllers;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Post;
use App\Tag;
use Illuminate\Http\Request;
class PostController extends Controller {
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
$posts = Post::with('user', 'tags')->get();
return response()->json($posts);
}
}
Laravel Routes:
<?php
Route::resource('user', 'UserController');
Route::resource('post', 'PostController');
Route::get('post/tag/{tag}', 'PostController@postsWithTag');
Route::resource('tag', 'TagController');
Route::controllers([
'auth' => 'Auth\AuthController',
'password' => 'Auth\PasswordController',
]);
Sorte de ballonnement pas organisé angulaire:
//App
var app = angular.module('app', [
'ngRoute',
'ngAnimate'
]);
//Config
app.config(['$routeProvider', '$locationProvider', '$animateProvider', function($routeProvider, $locationProvider, $animateProvider) {
$locationProvider.html5Mode(true).hashPrefix('!');
$routeProvider.
when('/', {
templateUrl: 'partials/home.html',
controller: 'PageController'
}).
when('/about', {
templateUrl: 'partials/about.html',
controller: 'AboutController'
}).
when('/contact', {
templateUrl: 'partials/contact.html',
controller: 'ContactController'
}).
when('/blog', {
templateUrl: 'partials/blog.html',
controller: 'PostsController'
}).
when('/blog/post/:postId', {
templateUrl: 'partials/post.html',
controller: 'PostController'
}).
otherwise({
redirectTo: '/'
});
}]);
//Factory
app.factory('Data', function Data($http) {
return {
getPosts: function getPosts() { return $http.get('http://api.domain.dev/post/'); },
getPost: function getPost(id) { return $http.get('http://api.domain.dev/post/' + id); },
addPost: function addPost(data) { return $http.post('http://api.domain.dev/post/', data); },
removePost: function removePost(id) { return $http.delete('http://api.domain.dev/post/'+ id); },
getTags: function getTags() { return $http.get('http://api.domain.dev/tag/'); },
getTag: function getTag(id) { return $http.get('http://api.domain.dev/tag/' + id); },
addTag: function addTag(data) { return $http.post('http://api.domain.dev/tag/', data); },
removeTag: function removeTag(id) { return $http.delete('http://api.domain.dev/tag/'+ id); },
}
});
//Posts Controller
app.controller('PostsController', function PostsController($scope, Data) {
Data.getPosts().success(parsePosts);
function parsePosts(data) {
$scope.posts = data;
}
//AddPost
$scope.newPost = { title: '', content: '', resume: '' };
$scope.addPost = function addPost(){Data.addPost({ title: $scope.newPost.title, content: $scope.newPost.content, resume: $scope.newPost.resume, user_id: $scope.newPost.user_id }).success(postAddSuccess).error(postAddError);}
function postAddSuccess(data) {
$scope.error = null;
$scope.posts.push(data);
$scope.newPost = { title: '', content: '', resume: '' };
}
function postAddError(data) {
$scope.error = data;
}
//RemovePost
$scope.removePost = function removePost(id) {
if (confirm('Do you really want to remove this post?')) {
Data.removePost(id).success(postRemoveSuccess);
}
}
function postRemoveSuccess(data) {
var i = $scope.posts.length;
while (i--) {
if ($scope.posts[i].id == data) {
$scope.post.splice(i, 1);
}
}
}
});
//Post Controller
app.controller('PostController', function PostController($scope, $routeParams, Data) {
Data.getPost($routeParams.id).success(parsePost);
function parsePost(data) {
$scope.post = data;
}
Data.getTags($routeParams.id).success(parsePostsTags);
function parsePostsTags(data) {
$scope.tags = data;
}
$scope.newTag = { tag: '' };
$scope.addTag = function addTag() {
$scope.newTag.post_id = $scope.post.id;
Data.addTag($scope.newTag).success(tagAddSuccess).error(tagAddError);
}
function tagAddSuccess(data) {
$scope.error = null;
$scope.tags.push(data);
$scope.newTag = { tag: '' };
}
function tagAddError(data) {
$scope.error = data;
}
$scope.removeTag = function removeTag(id) {
if (confirm('Do you really want to remove this tag?')) {
Data.removeTag(id).success(tagRemoveSuccess);
}
}
function tagRemoveSuccess(data) {
var i = $scope.tags.length;
while (i--) {
if ($scope.tags[i].id == data) {
$scope.tags.splice(i, 1);
}
}
}
});
//About Controller
app.controller('AboutController', function AboutController($scope, Data) {
});
//Portfolio Controller
app.controller('PortfolioController', function PortfolioController($scope, Data) {
});
//Contact Controller
app.controller('ContactController', function ContactController($scope, Data) {
});
//Page Controller
app.controller('PageController', function PageController($scope, Data) {
});
Je n'ai aucune idée où aller à partir d'ici.
J'ai tout essayé de la normale header()
mise en œuvre à l'aide de laravel-scro package pour mettre en œuvre via des filtres et de la _construct dans le contrôleur.
J'ai également passé par la configuration du serveur d'itinéraire et essayé d'ajouter l'en-tête de la .htaccess et le virtualhost config.
OriginalL'auteur user2298680 | 2015-03-14
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème, mais avec jQuery et m'a fallu des semaines pour obtenir une bonne solution.
J'mon cas, créer un middleware pour définir les en-têtes était la solution parfaite.
Créer un de la Scro middleware: App\Http\Middleware\Cors.php
N'oubliez pas de mettre de la Scro alias à l'intérieur de l'App\Http\Noyau
À l'intérieur des Routes, vous pouvez utiliser un middleware avec le groupe ou direct à une route spécifique, par exemple:
Si quelqu'un a déjà rencontré ce problème avec jQuery, je vous recommande d'utiliser $.ajax, au lieu de $.obtenez de dollars.post. Lorsque vous utilisez cette méthode, jQuery envoyer des données à l'aide de XMLHttpRequest et de définir le type de contenu application/x-www-form-urlencoded, il est impossible de changer ça, donc, l'utilisation d'Ajax.
par exemple:
Rappelez-vous: Si vous utilisez l'application/json sur l'en-tête de demande, vous devez fournir des "OPTIONS" de la méthode, de faire un contrôle en amont.
Plus d'infos à propos de la SCRO: http://www.html5rocks.com/en/tutorials/cors/
Resnpose::json()
,Response::make()
, etc. vous devez définir les en-têtes de nouveau (troisième argument), parce que les en-têtes définis par le middleware ne pas passer à la nouvelle instance de Réponse.dans mon cas, quand j'ai changé de withCredentials: true à false ses œuvres
OriginalL'auteur Rafael F.
Ajouter cette ligne avant de retourner
header("Access-Control-Allow-Origin: *");
Votre code doit être
J'ai eu le même problème. Mais j'ai résolu le problème en-tête("Access-Control-Allow-Origin: *");... Permet de voir quelqu'un va résoudre votre problème.
Mon Laravel 5.0 API est en train de perdre la session quand les angular.js apps connexion à partir d'un autre domaine. Ces angular.js les applications sont hébergées dans d'autres domaines, d'autres serveurs.
OriginalL'auteur Ramesh Murugesan
Ajouter ces lignes dans votre public/index.php:
Voir, si cela fonctionne.
OriginalL'auteur Gaurav Dave
Je n'ai pas une bonne connaissance de laravel.mais, Ma suggestion est de les en-têtes de requête d'accès RESTE Méthodes(GET,POST,PUT,EFFACEZ) et de l'origine de domaine spécifique à partir de laquelle de domaine en faisant la demande dans la suite de façon ou d'autre mis à '*'(il permet à n'importe quel domaine)
À angular js.Si vous utilisez <1.2 vous pouvez définir les catégories de documents dans le fichier contrôleur comme la façon suivante.Dans la dernière version pas nécessaire, il sera par défaut.vous devez définir quel type de contenu de votre attend de serveur par défaut est json.Si votre attendent autre type de contenu que vous pouvez définir manuellement dans la demande.
OriginalL'auteur Naresh Kumar
Lorsque vous appelez une origine de la croix-demande XHR, javascript premiers feux d'une demande d'OPTIONS à l'URL donnée. Si cette méthode n'en a pas ajouté dans vos itinéraires, puis il s'affiche une page d'erreur 404 qui est servi sans l'ACAO-tête de sorte que le béton POST demande ne sera pas envoyée, comme javascript voir-il pas permis d'.
OriginalL'auteur tacsiazuma
ajouter
à public/index.php si cela ne fonctionne pas dans la fonction comme le bleu cloches suggéré
OriginalL'auteur mukundi
ce que j'ai fait, mais vous ne savez pas si c'est la meilleure solution, mais il n'y a pas de la scro avec un
1.construire l'angle normalement à l'aide de
ng build --prod
2.déplacer le contenu de la
angular/dist
àlaravel/public
3.ensuite, utilisez ce simple code dans
laravel/routes/web.php
maintenant toutes les demandes en vient à Laravel et si on peut prendre de la demande avec un tracé cette route va travailler sinon il va passer à angulaires
OriginalL'auteur Robert