首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用AngularJS等框架的Symfony2和单网页应用程序

使用AngularJS等框架的Symfony2和单网页应用程序
EN

Stack Overflow用户
提问于 2013-04-10 17:52:37
回答 2查看 8.2K关注 0票数 19

(如果这里不是发布此类问题的合适位置,我很乐意在其他地方发布)

我正在尝试构建一个交互式web应用程序来管理公司资源。我有使用Symfony2的经验,但是我对这个新的应用程序有点碰壁。

我想让这个应用程序在客户端具有很强的交互性。几乎是一个完整的网页应用程序。我以前的web应用程序通常只使用带有CRUD页面的典型MVC模式。

在这些简单的应用程序中,我会使用

/employees/
/employees/create
/employees/detail/45
/employees/update/45
/employees/delete/45

在这类应用程序中使用symfony会给我带来很多好处:

  • Routing
  • Security (CSRF tokens)
  • FormTypes和带有Doctrine
  • Twig

的Form handling

  • Validation

  • Integration

特别是Twig中这样的功能非常令人耳目一新(因为我的模型是作为Doctrine实体构建的):

<p>{{ employee.getCurrentTask().description }}</p>

我现在面临的问题是,我觉得Symfony2并不是真正为单网页应用程序构建的。当我尝试添加一些Ajax功能时,我就遇到了这些问题

jQuery

  • Adding数据属性中无效的
  • CSRF令牌
  • 太多不可重用的视图/表示逻辑html中的属性无法获取id等...

然后我研究了Knockout.js和Angularjs,但后来我觉得失去了Doctrine和Twig的所有优势。无论如何,我必须在客户端重新构建模型,并且必须在两个不同的位置维护它们。

所以我想出了这个主意:

  • 使用Symfony2模型和控制器将数据持久化到数据库中,但是让symfony中控制器只发送JSON和接收JSON (也许是FOSRestBundle?)
  • 使用像AngularJS或KnockoutJS这样的框架在客户端重建JSON数据以使用双向绑定。

但是,如果我使用前端js框架,我该如何处理Doctrine2关系、表单验证、CSRF等问题呢?如果我使用前端js框架,Symfony已经解决了这些问题,但这些问题却无法使用。

欢迎所有的建议!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-26 16:02:35

关于JSON、序列化和模型的一些话

西蒙,我遇到了完全一样的问题。首先,就像ken已经提到的。您不需要重新构建任何模型。最好使用FosRestBundle和/或JMS序列化程序。它将具有关系的实体转换为JSON对象。这些对象通过api传输到您的前端,当您像这样使用angular.js时,您可以像在twig中一样使用它们。

{[{ user.username }]}

与树枝中的相同。但请记住,您必须为angular设置自定义括号,因为在默认情况下,它使用与twig相同的括号。

路由

您谈到的是单页面应用程序,因此symfony的路由被保持在较低的级别,以进行较少的页面刷新。相反,你必须使用你的前端框架的路由,因为我只熟悉angular.js,所以我给出一个angular示例:

app.config(function($routeProvider, $interpolateProvider) {

    //here you go, custom brackets
    $interpolateProvider.startSymbol('{[{');
    $interpolateProvider.endSymbol('}]}');

    $routeProvider.when('/user', {
        controller: UserController, 
        templateUrl: Routing.generate('suser_list')
    }).when('/ticket', {
        controller: TicketController, 
        templateUrl: Routing.generate('ticket_list')
    });
});

当你点击像这样的链接

<a href="#/ticket">Go to tickets</a>

AngularJs将知道触发哪个前端控制器。非常棒的东西,不需要重新加载页面。也可以看看。它允许你在javascript中生成symfony路由,我用它们来链接js控制器和html模板,在那里数据被推入。

FormTypes,表单处理,Validation

好吧,当你使用像angularjs这样的前端框架时,你的symfony表单类型是非常无用的。但我不确定。请记住,数据是通过api作为json进行推送和拉取的,我认为对于表单类型来说,要处理这种复杂性将是一项艰巨的工作。

对于验证,你可以使用angular的实时验证,或者在后端使用symfony的验证,没有问题。同时使用客户端和服务器端验证可能是一件好事。

Twig

小枝出局了。所有数据都是在客户端呈现的,而不是像twig那样预先呈现在服务器端。但是,只有当您的应用程序是真正的单页面应用程序时才会出现这种情况。当然,您可以使用twig,但只有在重新加载整个页面时,它才会刷新。

与Doctrine的集成

你仍然可以在后端使用规则。您有关于原理和SPA的具体问题吗?

票数 19
EN

Stack Overflow用户

发布于 2013-04-11 07:20:45

你不需要在客户端重建模型。我通常只在angularjs中创建一个提供json数据的服务。数据操作仍然发生在使用ajax的服务器端。

对于需要csrf的表单,我通常只通过json发送twig呈现的html。或者,您可以使用jms序列化程序序列化$form->createView()。但是,您需要一些客户端脚本来将json数据转换为实际的表单控件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15922531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档