在示例Symfony 2项目中集成Angularjs 2项目

时间:2016-07-02 07:36:33

标签: php angularjs node.js symfony

我们希望摆脱旧的Flex项目,将其重建为HTML5。因此,我们在Angularjs2中构建了一个概念证明,并希望将这些服务集成到现有的PHP Symfony 2后端中。但是,由于Angular在localhost:3000上使用nodejs运行“开箱即用”,而且Symfony2项目在localhost:8888上运行,因此会出现会话问题。从localhost:3000发送的请求在登录时每次调用都会返回不同的PHPSESSID,因此服务器不记得该用户。

解决此问题的最佳方法是什么?

我可以从localhost:8888运行Angularjs项目吗?如果我尝试它抱怨它不是从localhost:3000运行。

enter image description here

2 个答案:

答案 0 :(得分:1)

让我展示一个没有NodeJs的例子

首先,你必须安装NelmioCorsbundleFosRestbundle,而不是像

那样配置它们
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'

在app.service(前端)

中写下你的常规getter
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;
}]);

然后在后端创建一个端点

/**
 * 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')
        ]);
    }
};

最终从角度控制器或服务中获取数据

  $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;
  };

答案 1 :(得分:0)

好的,谢谢你,D.Dimitrioglo,最后的评论,&#39;这只是一个通知,不是错误。不要注意这个,所以我没有花时间搞清楚为什么我的主人没有被移植。我需要nodejs来编译我使用的TypeScript到Javascript,所以不是这样。我也没有明确需要NelmioCorseBundle和FosRestBundle。我的问题是

  1. 我必须在我的php项目的根目录中进行正确的npm清理/安装,而不是从我的angularjs /文件夹中复制粘贴它。
  2. angular / router-depricated(将url路由到项目中的不同页面)与Symfony2路由功能冲突,因此当我删除了角度路由器时,它显示了正确的页面并可以从localhost运行它:8888
  3. 之后我的会话在登录后保留了!感谢你的评论,它引导我朝着正确的方向前进!