Reputation: 1504
We want to get rid of an old Flex project, rebuilding it into HTML5. As a result of that we're building a proof of concept in Angularjs2 and want to integrate the services in the existing PHP Symfony 2 backend. But since Angular runs 'out of the box' with nodejs on localhost:3000 and the Symfony2 project runs on localhost:8888 I get session issues. Requests sent from the localhost:3000 get different PHPSESSID back in every single call while logged in, so the server doesn't remember the user.
What is the best way to approach this problem?
Can I run the Angularjs project from localhost:8888? If I try that it complains it's not running from localhost:3000.
Upvotes: 3
Views: 770
Reputation: 1504
Ok thank you, D.Dimitrioglo, for that last comment, 'It is just a notification, is not an error. do not pay your attention to this', so I didn't spend time on figgering out why my host was unsuported. I need nodejs though to compile the TypeScript I use into Javascript, so that was not it. Also I do not explicitly need NelmioCorseBundle and FosRestBundle. My problem is
After that my session was preserved after logged in! Thx for your comment it guided me in the right direction!
Upvotes: 0
Reputation: 3663
Let me show an example without NodeJs
Firs, you have to install NelmioCorsbundle
and FosRestbundle
, than configure them like
nelmio_cors:
paths:
'^/':
origin_regex: true
allow_origin: [ 'http://your-domain.com' ] << your frontend
allow_headers: ['Origin','Accept','Content-Type']
allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
max_age: 3600
hosts:
- "^(http?://)?api\.your-domain.com?" << your backend as subdomain
fos_rest:
param_fetcher_listener: true
body_listener: true
format_listener: true
view:
view_response_listener: 'force'
Write your general getter in your app.service (frontend)
yourApp.factory('appService', ['$http', '$q', '$localStorage',
function($http, $q, $localStorage)
{
var $this = {};
$this.mainGetter = function(action, config) {
var deferred = $q.defer();
$http({
method: 'GET',
url: $this.domain + action,
params: config
}).then(function(data) {
deferred.resolve(data);
}, function(error) {
deferred.reject(error);
});
return deferred.promise;
};
return $this;
}]);
then create an endpoint in your backend
/**
* API Controller
* @CFG\Route("/api")
*/
class ApiController extends FOSRestController
{
/**
* @CFG\Route("/get-something", name="get_smt")
* @CFG\Method("GET")
* @param Request $request
* @return JsonResponse
*/
public function getPostsAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$something = $em->getRepository('SomeRepo')->findAll();
$serializer = $this->get('jms_serializer');
return new JsonResponse([
'isError' => 0,
'data' => $serializer->serialize($something, 'json')
]);
}
};
And finnaly get the data from your angular controller or service
$this.getApiData = function(alias) {
var deferred = $q.defer();
appService.mainGetter('/get-something', {})
.then(function(response) {
var data = response.data;
if (data.isError) {
deferred.reject(data.error);
} else {
deferred.resolve(data.data);
}
});
return deferred.promise;
};
Upvotes: 1