我正在开发一个在前端使用大量JavaScript的SF2应用程序。
SF2为我提供了一个构建良好的REST应用程序,使用学说管理数据库,将枝条用于模板等的好方法,但是我想使用Angularjs。
我知道angularjs和SF2是两种使用不同方法的不同框架,但是我想知道实现此工作的最佳方法是什么。
值得吗?
如果是,您认为更清洁,最有效的解决方案是什么?
也许使用php代替树枝作为模板来使用angularjs花括号?
Answers:
我认为Symfony2
可以很好地配合使用AngularJS
。证明是,我一方面使用Symfony制作了一个API,另一方面使用AnglularJS制作了一个Web应用程序。
此外,由于某些原因,我使用生成了我的Web应用程序中的视图Twig
。{% verbatim %} {% endverbatim %}
每次我需要在视图中使用Angular时,我都只是将angular的花括号嵌入到树枝语句中。
我遇到相同的情况,就我而言,我决定拆分客户端和服务器项目,我将symfony2用作服务器端,因为它除了给我带来的其他优势之外还具有简单性和可用性。另一方面,我使用AngularJS创建了一个简单的HTML项目,这对我很有用,因为我想使用相同的客户端文件创建HTML5移动应用程序。
在这种情况下,我认为问题的核心在于身份验证和授权过程。您必须在服务器端实现用于在REST中工作的安全防火墙(例如WSSE:Symfony2:如何创建自定义身份验证提供程序)。
然后在客户端找到相应的实现(AngularJS),这是我发现的最有用的资源: Github:witoldsz / angular-http-auth。
如果您想对sf2项目进行更深入的实现,则可以使用Assetic的过滤器来编译AngularJS,并提高页面加载的性能。
我已使用以下代码更改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>
我认为这可以使事情保持清洁,并可以轻松地将树枝和角度标签混合在一起。这对我来说似乎很好。
最好将角度应用程序分开。只需将Symfony用作用于数据检索/持久性的api和安全提供程序即可。
这将允许视图和数据层之间更大的分离。结果,您可以开始在前端方面工作,而无需考虑后端实现。您只需要模拟api调用。
我一直在尝试使用Symfony和angularjs构建一个单页应用程序。我将Symfony2与FOSRestBundle一起使用来构建Restful API,并使用Angularjs来构建前端。
AngularJs本身就不需要Symfony2框架来构建应用程序,只要它具有可以与之通信的API。但是,我发现Symfony2在以下方面很有用:
模板中的翻译。API有效负载中的数据在大多数情况下不需要转换。对模板使用Symfony I18N支持非常合理。
加载选项列表。假设您有一个包含200多个选项的国家/地区列表。您可以构建一个API来填充angularjs中的动态下拉列表,但是由于这些选项是静态的,因此您可以简单地在twig中构建该列表。
预加载数据/内容。您可以根据需要在托管页面中预加载模板或JSON数据
利用Symfony的身份验证功能。您也可以使用与应用程序API相同的身份验证会话。无需使用Oauth。
Assetic捆绑包非常有用,可用于对AngularJs使用的Javascript文件进行打包和最小化
但是,我确实发现了以下挑战:
用于多个Ajax调用的PHP会话锁定。需要一种更好的方法来释放php会话,方法是调用“ session_write_close()”或使用数据库进行会话。在Symfony中最好的地方是调用“ session_write_close”函数的位置,以便我们可以释放会话以便尽快进行更多的ajax调用?
重新加载/同步加载的数据假设您在浏览器中显示了一个项目列表(例如ebay项目),那么当服务器端更新列表时,您想在客户端浏览器中更新该列表。您可能需要定期轮询列表或使用Firebase之类的工具。在大多数情况下,Firebase太过强大了,轮询对我而言并不好,但是实现此目的的最佳方法是什么?
请添加您的评论。谢谢
websocket
是要走的路。 我知道距您发表文章已有将近两年的时间,但是我想评论一下,以供将来参考。
我自己试图使Symfony和AngularJS一起工作时遇到了很多问题。但是,在研究它时,我学到了一些可以帮助您的事情:
{{ variable }}
与树枝大括号分开,可以使用以下三种方法:一种)。在AngularJS表达式周围使用引号{{ '{{ variable }}' }}
b)。用包围您的AngularJS代码{% verbatim %} your code {% endverbatim %}
C)。使用AngularJSinterpolateProvider
服务
angular.module('myApp', []).config(function($interpolateProvider){
$interpolateProvider.startSymbol('{[{').endSymbol('}]}');
});
$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'}
});
当您想知道请求是否是控制器内的AJAX请求时,我们通常使用isXMLHttpRequest()方法。问题在于Angular不会将其请求标识为XMLHttpRequest请求。用这个:
var app = angular.module('myModule', []);
app.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
}]);
在创建表单时,您可以选择通过AngularJS显示表单,并让Symfony Form处理请求。为此,您需要禁用CSRF保护:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => '...',
'csrf_protection' => false
));
}
现在,您的symfony表单可以接收来自自定义Angular请求的数据。
除了所有事情,我仍然不确定是否要使用Symfony或AngularJS显示表单。
希望这可以帮助。
从理论上讲,您只需要从symfony渲染索引页,因此根本不需要使用twig。您只需要呈现第一页,然后角度框架就可以接管。Angularjs具有自己的模板语法和功能。我认为没有必要将这两个框架混在一起,因为您可以将两个框架完全分开。也许,使您的服务器在yourdomain.com上使用文件index.html(您的角度应用程序)进行响应,而symfony的所有内容都来自/ api前缀之类的。想象一下,您的WebApi项目是一个服务器,而另一个是angularjs项目。我认为,他们只会通过api调用进行通话,根本不需要混合模板。
通过网络搜索,我遇到了不同的解决方案。例如,您可以如上所述更改角度符号。但是,我更喜欢通过简单地告诉twig输出角度符号来使其尽可能简单:
{{ '{{entity.property}}' }}
{@ variable @}
在模板中使用。生成的模板后,只需更换{@
与{{
和@}
具有}}
简单str_replace
功能。这种方法很干净,比字符串混叠等等要快得多。
我遇到过同样的情况,我不得不在Symfony2之上使用AngularJS开发一个单页应用程序。
如果可以将两个应用程序分开,那就太好了!!!它将在模型层和视图层之间产生很大的分离。如果不是这样,那么就像我的应用程序一样,您当然可以将AngularJS与Symfony2和TWIG完美配合使用。
我在AngularJS表达式周围使用了引号,例如-
{{ '{{someAngularJsExpression}}' }}
习惯它只需要花费一些时间,但是一旦您习惯了,就不会遇到很多问题。Symfony还允许您使用其他模板引擎,但我不想这样做。
所以我的建议是为AngularJS和Symfony有两个不同的应用程序。如果您没有资源这样做,可以按照我的方式做。不用担心,您会习惯的。
今天,每个人都想要带有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调用-这为您提供了巨大的可能性