AngularJS在symfony2应用程序上


73

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

SF2为我提供了一个构建良好的REST应用程序,使用学说管理数据库,将枝条用于模板等的好方法,但是我想使用Angularjs。

我知道angularjs和SF2是两种使用不同方法的不同框架,但是我想知道实现此工作的最佳方法是什么。

值得吗?

如果是,您认为更清洁,最有效的解决方案是什么?

也许使用php代替树枝作为模板来使用angularjs花括号?

Answers:


64

我认为Symfony2可以很好地配合使用AngularJS。证明是,我一方面使用Symfony制作了一个API,另一方面使用AnglularJS制作了一个Web应用程序。

此外,由于某些原因,我使用生成了我的Web应用程序中的视图Twig{% verbatim %} {% endverbatim %}每次我需要在视图中使用Angular时,我都只是将angular的花括号嵌入到树枝语句中。


9
您还可以为您的应用更改angularjs的插值标签
Kevin Bond

@intrepion您如何使AngularJS指令与Symfony的FormType字段一起使用。CollectionType?我有一个问题stackoverflow.com/questions/38389740/...
utkarsh2k2

26

从Twig 1.12开始,原始标签已重命名为逐字

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

Twig引擎不会解析它们之间的所有内容,而AngularJS可以使用它们。

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


17

我遇到相同的情况,就我而言,我决定拆分客户端和服务器项目,我将symfony2用作服务器端,因为它除了给我带来的其他优势之外还具有简单性和可用性。另一方面,我使用AngularJS创建了一个简单的HTML项目,这对我很有用,因为我想使用相同的客户端文件创建HTML5移动应用程序。

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

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

如果您想对sf2项目进行更深入的实现,则可以使用Assetic的过滤器来编译AngularJS,并提高页面加载的性能。


13

我已使用以下代码更改AngularJS传递器

咖啡脚本:

# 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的body标签部分中,我可以使用:

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

我认为这可以使事情保持清洁,并可以轻松地将树枝和角度标签混合在一起。这对我来说似乎很好。


11

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


11

最好将角度应用程序分开。只需将Symfony用作用于数据检索/持久性的api和安全提供程序即可。

这将允许视图和数据层之间更大的分离。结果,您可以开始在前端方面工作,而无需考虑后端实现。您只需要模拟api调用。


^-这个。将ng与Twig混合会给自己造成伤害。如果您正确使用了API,则可以在认为合适时就退出并破坏UI,而不必担心业务逻辑。结果,测试更加容易。
Thinice '16

8

我一直在尝试使用Symfony和angularjs构建一个单页应用程序。我将Symfony2与FOSRestBundle一起使用来构建Restful API,并使用Angularjs来构建前端。

AngularJs本身就不需要Symfony2框架来构建应用程序,只要它具有可以与之通信的API。但是,我发现Symfony2在以下方面很有用:

  1. 模板中的翻译。API有效负载中的数据在大多数情况下不需要转换。对模板使用Symfony I18N支持非常合理。

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

  3. 预加载数据/内容。您可以根据需要在托管页面中预加载模板或JSON数据

  4. 利用Symfony的身份验证功能。您也可以使用与应用程序API相同的身份验证会话。无需使用Oauth。

  5. Assetic捆绑包非常有用,可用于对AngularJs使用的Javascript文件进行打包和最小化

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

  1. 用于多个Ajax调用的PHP会话锁定。需要一种更好的方法来释放php会话,方法是调用“ session_write_close()”或使用数据库进行会话。在Symfony中最好的地方是调用“ session_write_close”函数的位置,以便我们可以释放会话以便尽快进行更多的ajax调用?

  2. 重新加载/同步加载的数据假设您在浏览器中显示了一个项目列表(例如ebay项目),那么当服务器端更新列表时,您想在客户端浏览器中更新该列表。您可能需要定期轮询列表或使用Firebase之类的工具。在大多数情况下,Firebase太过强大了,轮询对我而言并不好,但是实现此目的的最佳方法是什么?

请添加您的评论。谢谢


2
第二个挑战websocket是要走的路。 我知道距您发表文章已有将近两年的时间,但是我想评论一下,以供将来参考。
Lashae

3

您可以使用此模板,也可以研究此模板,并以此为基础。

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

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


3

我自己试图使Symfony和AngularJS一起工作时遇到了很多问题。但是,在研究它时,我学到了一些可以帮助您的事情:

  1. 要将AngularJS表达式{{ variable }}与树枝大括号分开,可以使用以下三种方法:

一种)。在AngularJS表达式周围使用引号{{ '{{ variable }}' }}

b)。用包围您的AngularJS代码{% verbatim %} your code {% endverbatim %}

C)。使用AngularJSinterpolateProvider服务

angular.module('myApp', []).config(function($interpolateProvider){
    $interpolateProvider.startSymbol('{[{').endSymbol('}]}');
});
  1. 在js文件中,twig无法为您生成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. 在创建表单时,您可以选择通过AngularJS显示表单,并让Symfony Form处理请求。为此,您需要禁用CSRF保护:

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

现在,您的symfony表单可以接收来自自定义Angular请求的数据。

除了所有事情,我仍然不确定是否要使用Symfony或AngularJS显示表单

希望这可以帮助。


2

从理论上讲,您只需要从symfony渲染索引页,因此根本不需要使用twig。您只需要呈现第一页,然后角度框架就可以接管。Angularjs具有自己的模板语法和功能。我认为没有必要将这两个框架混在一起,因为您可以将两个框架完全分开。也许,使您的服务器在yourdomain.com上使用文件index.html(您的角度应用程序)进行响应,而symfony的所有内容都来自/ api前缀之类的。想象一下,您的WebApi项目是一个服务器,而另一个是angularjs项目。我认为,他们只会通过api调用进行通话,根本不需要混合模板。




0

我遇到过同样的情况,我不得不在Symfony2之上使用AngularJS开发一个单页应用程序。

如果可以将两个应用程序分开,那就太好了!!!它将在模型层和视图层之间产生很大的分离。如果不是这样,那么就像我的应用程序一样,您当然可以将AngularJS与Symfony2和TWIG完美配合使用。

我在AngularJS表达式周围使用了引号,例如-

{{ '{{someAngularJsExpression}}' }}

习惯它只需要花费一些时间,但是一旦您习惯了,就不会遇到很多问题。Symfony还允许您使用其他模板引擎,但我不想这样做。

所以我的建议是为AngularJS和Symfony有两个不同的应用程序。如果您没有资源这样做,可以按照我的方式做。不用担心,您会习惯的。


0

今天,每个人都想要带有api和angular / vue前端的symfony后端-很好,但是这样我们就失去了前端中的所有symfony功能。

我在我的symfony应用程序中成功使用了angular。也许这不是高性能的东西,但它可以工作。

给您的一些提示:

1个

了解有关$ interpolateProvider的信息

angular.module('myApp', [], function($interpolateProvider) {
            $interpolateProvider.startSymbol('{[{');
            $interpolateProvider.endSymbol('}]}');
  });

这样,您可以将{{}}的角度更改为其他内容。我正在使用{[{和}]},所以不会干扰树枝

2

第二好的是 https://symfony.com/doc/master/bundles/FOSJsRoutingBundle/index.html

这将symfony路由与js连接起来,因此symfony可以生成js中所有的角度视图或ajax调用-这为您提供了巨大的可能性


-2

您可以简单地将花括号转义,例如:

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

它将解析为下一个HTML代码:

Hello {{ name }}

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

&#123; name &#125;

但是我不确定AngularJS lib :)是否会理解它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.