一尘不染

使用诸如AngularJS之类的Symfony2和单个网页应用程序

angularjs

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

我正在尝试构建一个交互式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向绑定。

但是,我该如何解决Symfony已经解决但无法使用Doctrine2 Relationships,Form
Validation,CSRF等问题,但是如果使用前端js框架则无法使用?

欢迎提出所有建议!


阅读 256

收藏
2020-07-04

共1个答案

一尘不染

关于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推入和拉出的,我认为这对于表单类型来处理这种共性将是一项艰巨的工作。

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

枝条

特格(Twig)不参加比赛。所有数据都是在客户端渲染的,而不是像树枝一样在服务器端渲染的。但是只有在您的应用程序实际上是单页应用程序的情况下,才是这种情况。当然可以使用树枝,但只有重新加载整个页面后它才会刷新。

与学说的整合

您仍然可以在后端使用主义。您有关于教义和SPA的特定问题吗?

2020-07-04