Angularjs在symfony2应用程序上

我正在使用前端使用大量JavaScript的SF2应用程序。

SF2为我提供了一个很好的方法来构build一个不错的REST应用程序,使用教义pipe理我的数据库,为模板使用树枝等等,但是我想使用Angularjs。

我知道angularjs SF2是2种不同的框架与不同的方法,但我想知道做什么最好的方法是这样的。

它甚至值得吗?

如果是的话,你认为什么是更清洁和最有效的解决scheme?

也许使用PHP而不是树枝模板使用angularjs大括号?

我认为Symfony2可以很好的与AngularJS 。 certificate是我使用Symfony在一边制作API,而在另一边使用AnglularJS制作一个Web应用程序。

而且,由于某些原因,我在Twig Web应用程序中产生了我的观点。 每次我需要在我的视图中使用Angular时,我只需将{% verbatim %} {% endverbatim %}括号embedded到小枝{% verbatim %} {% endverbatim %}语句中。

截至Twig 1.12,原始标签被重新命名为逐字 :

 {% verbatim %} <ul> {% for item in seq %} <li>{{ item }}</li> {% endfor %} </ul> {% endverbatim %} 

中间的所有内容都不会被Twig Engineparsing,并且可以被AngularJS使用。

虽然我build议更改AngularJS分隔符。 否则,在查看模板时,很难区分Twig和AngularJS代码。

我面临同样的情况,在我的情况下,我决定拆分客户端和服务器项目,我使用symfony2作为服务器端,因为它除了带给我的其他优点以外,还具有简单性和可用性。 另一方面,我使用AngularJS创build了一个简单的HTML项目,这对我很有用,因为我想创build一个具有相同客户端文件的HTML5 Mobile App。

在这种情况下,我认为问题的核心在于authentication和授权过程。 您必须在服务器端实现安全防火墙,以在REST中工作(例如,WSSE: Symfony2:如何创build自定义身份validation提供程序 )。

然后在客户端(AngularJS),我发现最有用的资源相应的实现: Github:witoldsz / angular-http-auth 。

如果您希望使用sf2项目进行更深入的实施,则可以使用Assetic的filter编译AngularJS,并获得页面加载的性能。

我已经使用下面的代码来改变AngularJS的delmiters

CoffeeScript的:

 # Change the angular delimiters for twig compatability # and load module with ngResource WAFapp2 = angular.module("WAFapp2", ['ngResource'], ($interpolateProvider) -> $interpolateProvider.startSymbol "{[{" $interpolateProvider.endSymbol "}]}" ) var WAFapp2; 

或Javascript:

 var WAFapp2; WAFapp2 = angular.module("WAFapp2", ['ngResource'], function($interpolateProvider) { $interpolateProvider.startSymbol("{[{"); return $interpolateProvider.endSymbol("}]}"); }); 

然后在我的布局顶部:

 <!DOCTYPE html> <html lang="en" data-ng-app="WAFapp2"> <head> 

然后在HTML的身体标签部分我可以使用:

 <ul> {% for item in seq %} <li>{[{ item }]}</li> {% endfor %} </ul> 

我认为这样可以保持干净,并且可以轻松混合树枝和angular标签。 这似乎对我很好。

为避免混淆,一个很好的解决scheme是基于属性的指令ng-bind: <p ng-bind="yourText"></p><p>{{yourText}}</p>

保持angular度的应用程序分离更明智。 只需使用Symfony作为数据检索/持久性的api和安全提供程序。

这将允许视图和数据层更大的分离。 因此,您可以开始在前端工作,而不用考虑后端实现。 你只需要模拟api调用。

我一直在试图使用Symfony和angularjs构build一个单页面应用程序。 我用Symfony2和FOSRestBundle构build了一个Restful API和Angularjs来构build前端。

AngularJs本身并不需要Symfony2框架来构build一个应用程序,只要它有一个API来交谈即可。 但是,我发现Symfony2在这些方面很有用:

  1. 在模板中翻译。 在大多数情况下,API有效内容中的数据不需要翻译。 使用Symfony I18N对模板的支持非常有意义。

  2. 加载选项列表。 假设你有一个有200多个选项的国家名单。 您可以构build一个API来填充angularjs中的dynamic下拉列表,但由于这些选项是静态的,因此您可以简单地在twig中构build该列表。

  3. 预加载数据/内容。 如果您愿意,您可以在托pipe页面中预先加载模板或JSON数据

  4. 利用Symfony的身份validationfunction。 您也可以对应用程序的API使用相同的身份validation会话。 不需要使用Oauth。

  5. 该资产包是非常有用的urulfy和缩小AngularJs使用的JavaScript文件串

但是,我确实发现了以下挑战:

  1. PHP会话locking多个Ajax调用。 需要一个更好的方法来通过调用'session_write_close()'或使用数据库会话来释放php会话。 Symfony最好的地方在哪里调用这个'session_write_close'函数,以便我们尽快释放会话以便更多的ajax调用?

  2. 重新加载/同步加载的数据假设你有一个浏览器中显示的项目列表(如eBay项目),当你在服务器端更新列表时,你需要在客户端浏览器中更新列表。 您可能需要定期轮询列表或使用类似Firebase的内容。 在大多数情况下,Firebase是一个矫枉过正的问题,投票对我来说不是很好,但是实现这一目标的最好方法是什么?

请添加您的评论。 谢谢

你可以使用这个模板,或者你可以学习这个模板,你可以基于它。

是一个模板应用程序,通过使用AngularJS的客户端部分与使用Symfony2的服务器部分之间的RestFul API进行安全通信。

另一个应该检查的项目是Aisel是基于Symfony2和AngularJS的高负载项目的开源CMS

我一直在努力让Symfony和AngularJS一起工作,我一直面临很多问题。 但是在工作的过程中,我学到了一些可以帮助你的东西:

  1. 要将AngularJSexpression式{{ variable }}与树枝大括号分开,您有三种select:

一个)。 使用AngularJSexpression式{{ '{{ variable }}' }}的引号

B)。 将你的AngularJS代码用{% verbatim %} your code {% endverbatim %}

C)。 使用AngularJS interpolateProvider服务

 angular.module('myApp', []).config(function($interpolateProvider){ $interpolateProvider.startSymbol('{[{').endSymbol('}]}'); }); 
  1. 在js文件中,树枝无法为您生成url。 为此,您可以使用“friendsofsymfony / jsrouting-bundle”。 安装后,你可以使用它: $http.get(Routing.generate('route_name', {'id':id}));

这可能不适合你提交,为什么? 关于$ http.post,你应该知道的一件事情是,它不把数据作为“表单数据”发送,而是作为“请求有效载荷”,这是通过HTTP POST传输数据的正常方式。 问题是,这种“正常的方式”不等同于表单提交,这导致用Symfony Request对象解释数据的问题。

用这个代替:

 $http.put(url, $.param({foo: 'bar'}), { headers: {'Content-Type': 'application/x-www-form-urlencoded'} }); 
  1. 当你想知道请求是否是控制器内的AJAX请求时,我们通常使用isXMLHttpRequest()方法。 问题在于Angular不会将其请求标识为XMLHttpRequest请求。 用这个:

    var app = angular.module('myModule', []); app.config(['$httpProvider', function($httpProvider) { $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest'; }]);

  2. 在创build表单时,您可以select通过AngularJS显示表单并让Symfony表单处理请求。 为此,您需要禁用CSRF保护:

    public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => '...', 'csrf_protection' => false )); }

现在你的symfony表单可以从一个自定义的Angular请求中接收数据。

抛开所有的东西,我还是不确定是否使用Symfony或者AngularJS来显示你的表单

希望这可以帮助。

从理论上讲,你只需要从symfony提供你的索引页面,所以你根本就不用使用树枝。 你只需要呈现第一页,然后angular框架接pipe。 Angularjs有自己的模板语法和function。 我不认为有必要混合这两个,因为你可以完全分离这两个框架。或者,让你的服务器与yourdomain.com上的文件index.html(你的angular度的应用程序)响应,从symfony的一切都来自/ API前缀,或类似的东西。 试想一下,您的WebApi项目是另一个服务器和angularjs项目。 他们只会通过API通话,根本不需要混合模板。

通过networkingsearch,我遇到了不同的解决scheme。 例如,如前所述,可以更改angular度符号。 但是,我更愿意通过简单地告诉树枝输出angular度符号来尽可能保持最简单:

 {{ '{{entity.property}}' }} 

http://louisracicot.com/blog/angularjs-and-symfony2/

在模板中使用{@ variable @} 。 生成模板后,用{{{{@} }}用简单的str_replace函数}}replace。 这种方式干净而且快速,然后串联等等。

你可以简单地跳过花括号,如:

 Hello {{ '{{' }} name {{ '}}' }} 

它将被parsing为下一个HTML代码:

 Hello {{ name }} 

您也可以尝试使用左右花括号HTML编码的字符集,例如:

 &#123; name &#125; 

但我不确定它会被AngularJS lib所理解:)。