Angularjs ajax请求Symfony2和Doctrine json响应中的关系

时间:2015-03-12 19:06:44

标签: json angularjs symfony doctrine-orm

我正在尝试使用Symfony2,Doctrine和Angujarjs。 Symfony2或Doctrine没有问题但是我在使用带有angularjs的ajax请求时遇到了问题。要么它没有加载任何东西,我在加载json(json来自Symfony及其工作)时确实犯了错误,或者它是否有效,但json不包含任何关系& #39; s数据。

那么,正确的方法是什么 答:使用关系数据(例如文章和类别)为angularjs创建响应 B:将请求的json加载到angularjs变量

这是我的controller.js

var app = angular.module("MyApp", []) .config(['$interpolateProvider', function ($interpolateProvider) {

    $interpolateProvider.startSymbol('[[');
    $interpolateProvider.endSymbol(']]');

}]);

app.filter('offset', function() {

    return function(input, start) {
        start = parseInt(start, 10);
        return input.slice(start);    
    };

});

app.filter('htmlToPlaintext', function() {

    return function(text) {
        return String(text).replace(/<[^>]+>/gm, '');
    };

});

app.controller("PaginationCtrl", function($scope, $http) {

    $scope.articlesPerPage = 8;
    $scope.currentPage = 0;

        function htmlToPlaintext(text) {
            return String(text).replace(/<[^>]+>/gm, '');
        }

    // this should load the json from '/admin/jsonallarticles' into the articles variable
    $http.get('/admin/jsonallarticles').success(function(data) {
        $scope.articles = data;
    });

    $scope.range = function() {
        var rangeSize = 5;
        var ret = [];
        var start;
        start = $scope.currentPage;

        if ( start > $scope.pageCount()-rangeSize ) {
            start = $scope.pageCount()-rangeSize+1;
        }

        for (var i=start; i<start+rangeSize; i++) {
            ret.push(i);
        }

        return ret;
    };

    $scope.prevPage = function() {
        if ($scope.currentPage > 0) {
        $scope.currentPage--;
        }
    };

    $scope.prevPageDisabled = function() {
        return $scope.currentPage === 0 ? "disabled" : "";
    };

    $scope.pageCount = function() {
        return Math.ceil($scope.articles.length/$scope.articlesPerPage)-1;
    };

    $scope.nextPage = function() {
        if ($scope.currentPage < $scope.pageCount()) {
            $scope.currentPage++;
        }
    };

    $scope.nextPageDisabled = function() {
        return $scope.currentPage === $scope.pageCount() ? "disabled" : "";
    };

    $scope.setPage = function(n) {
    $scope.currentPage = n;
    };

});

这是我的symfony2功能

 public function jsonallarticlesAction() {

    $articles = $this->getDoctrine()
        ->getRepository('AcmeBlogBundle:Articles');

    if ( !$articles ) {
         throw $this->createNotFoundException(
                 'Keine Beiträge gefunden!');
     }

   $queryArticles = $articles->createQueryBuilder('a')
            ->where('a.status = :status')
            ->setParameter('status', 0)
            ->orderBy('a.createdDate', 'DESC')
            ->getQuery()
            ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);;

    $articles = array_values($queryArticles);   

    $response = new Response();
    $response->setContent(json_encode($articles));

    $response->headers->set('Content-Type', 'application/json');

    return $response;

 }

EDITED CONTROLLER

我尝试使用Symfony附带的序列化程序

    $encoders = array(new XmlEncoder(), new JsonEncoder());
    $normalizers = array(new GetSetMethodNormalizer());

    $serializer = new Serializer($normalizers, $encoders);

    $articles = $this->getDoctrine()
            ->getRepository('AcmeBlogBundle:Articles')
            ->findAll();

    if ( !$articles ) {
         throw $this->createNotFoundException(
                 'Keine Artikel gefunden!');
     }

    $serializer->serialize($articles, 'json');
    return new Response(json_encode($json));

但我收到错误:

    A circular reference has been detected (configured limit: 1). 

2 个答案:

答案 0 :(得分:2)

对于使用Angular.js,您必须编写Rest API。为此,您可以使用https://github.com/FriendsOfSymfony/FOSRestBundle

要使用所需数据序列化您的实体,请使用http://jmsyst.com/bundles/JMSSerializerBundle

与FOSRestBundle兼容。

作为使用这些捆绑包的示例,您可以查看我们的项目https://github.com/stfalcon-studio/lost-and-found

答案 1 :(得分:0)

我遇到了同样的问题,这是因为我的实体与另一个领域的第二个实体的相同实体有关。我只是在我的实体中创建了这个函数:

public function removeRelationsThatCauseCircularError()
{
  $this->companyEvents = NULL;
}

在通过序列化程序之前运行该函数。