2013-04-10 49 views
17

(如果不张贴这类问题的正确的地方我会高兴地将它张贴其他地方)Symfony2的单网页应用

我试图建立一个互动web应用程序来管理公司资源。 我有Symfony2的经验,但我有点用这个新的应用程序撞墙。

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

在这些简单的应用我会

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

在这种应用中使用的symfony会给我一个很大的优势:

  • 路由
  • 安全(CSRF令牌)
  • FormTypes和Form处理
  • 验证
  • 集成主义
  • 嫩枝

像这样的枝杈特别的功能是非常清爽(因为我的模特们打造的学说实体):

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

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

  • CSRF令牌无效
  • 太多的不可重复使用的视图/显示逻辑jQuery中
  • 添加数据的属性在HTML获取ID的等...

然后,我看着Knockout.js和Angularjs,但后来我觉得失去了教条和枝条的所有优点。无论如何,我必须在客户端重建我的模型,并且必须在两个不同的位置维护它们。

所以我想出了这个主意:(?FOSRestBundle也许)

  • 使用Symfony2的模型和控制器留存数据到数据库,但让symfony的控制器只是发出JSON和接收JSON
  • 使用像AngularJS或KnockoutJS这样的框架来重建客户端上的JSON数据以使用双向绑定。

但后来我将如何应对像Doctrine2关系,表单验证,CSRF这Symfony的已经解决,但不可用的问题,如果我使用一个前端JS框架?

欢迎您提出任何建议!

回答

19

约JSON,系列化一些词和模型

西门,我面对完全一样的问题和困难。首先像肯已经提到。你不需要重建任何模型。更好地使用FosRestBundle和/或JMS串行器。它将您的实体与关系转换为JSON对象。这个对象通过API传输到您的前端,你可以与他们在树枝的工作就像,当你使用angular.js这样

{[{ user.username }]} 

是一样的树枝。但请记住,您必须为角度设置自定义括号,因为默认情况下它使用与树枝相同的方式。

路由

你讲一个单页的应用程序,所以symfony中的路由保持在一个较低的水平有几个页面刷新。相反,你必须使用你的前端框架的路由,因为我只熟悉angular.js,我举一个例子角:

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就知道了哪个前端控制器可以触发。相当好的东西,没有页面重新加载。也看看FosJSRoutingBundle。它可以让你产生在JavaScript symfony的路线,我用它们来JS控制器,其中数据被推入HTML模板链接。

FormTypes,表单处理,验证

那么,当你使用一个前端框架像angularjs,你的symfony表单类型是非常没用的。但我不确定。记住数据是通过api作为json推送和拉取的,我认为这对于表单类型处理这种强制性是一项艰巨的工作。

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

嫩枝

嫩枝是退出了比赛。所有的数据都在客户端渲染,而不是像服务器一样在服务器端预渲染。但是,只有您的应用程序确实是一个单页面应用程序才是这种情况。当然,您可以使用树枝,但只有在重新加载整个页面时才会刷新。

集成主义

,您仍然可以使用学说的后端。关于教义和SPA,你有一个具体的问题吗?

+0

只是想分享一下,你仍然可以使用FormType就好,没有任何问题。当你从REST请求收到数据时,它可以被解析,然后就像任何其他表单提交一样。 – mr1031011 2014-09-25 12:14:59

2

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

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

+0

感谢您的输入!但是,那么你将无法使用http://docs.angularjs.org/api/ngResource.$resource提供的所有魔法? – Simon 2013-04-11 08:04:42