19

(如果这不是发布此类问题的正确位置,我很乐意将其发布到其他地方)

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

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

在那些简单的应用程序中,我会有

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

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

  • 路由
  • 安全性(CSRF 令牌)
  • FormTypes 和表单处理
  • 验证
  • 与教义融合
  • 枝条

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

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

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

  • CSRF 令牌无效
  • jQuery中有太多不可重用的视图/表示逻辑
  • 在 html 中添加数据属性以获取 id 等...

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

所以我想出了这个主意:

  • 使用 Symfony2 模型和控制器将数据持久化到数据库,但让 symfony 中的控制器只发送 JSON 并接收 JSON(FOSRestBundle 可能吗?)
  • 使用 AngularJS 或 KnockoutJS 之类的框架在客户端重建 JSON 数据以使用 2 路绑定。

但是如果我使用前端 js 框架,我将如何解决 Symfony 已经解决但无法使用的 Doctrine2 关系、表单验证、CSRF 等问题?

欢迎所有建议!

4

2 回答 2

19

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

西蒙,我面临着完全相同的问题。首先就像 ken 已经提到的。您不需要重建任何模型。最好使用 FosRestBundle 和/或 JMS Serializer。它将具有关系的实体转换为 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 会知道触发哪个前端控制器。非常棒的东西,无需重新加载页面。也看看FosJSRoutingBundle。它允许您在 javascript 中生成 symfony 路由,我使用它们将 js 控制器与推入数据的 html 模板链接。

FormTypes,表单处理,验证

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

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

枝条

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

与教义融合

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

于 2013-04-26T08:02:34.847 回答
2

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

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

于 2013-04-10T23:20:44.980 回答