(如果这不是发布此类问题的正确位置,我会很乐意将其发布到其他地方)
我正在尝试构建一个交互式Web应用程序来管理公司资源。我有Symfony2的经验,但是我对这个新应用程序有点不满意。
我想使该应用程序在客户端上具有很大的交互性。几乎是一个完整的网页应用程序。我以前的Web应用程序通常只对CRUD页面使用典型的MVC模式。
在那些简单的应用程序中,我将拥有
/employees/ /employees/create /employees/detail/45 /employees/update/45 /employees/delete/45
在这种应用程序中使用symfony将给我带来很多好处:
特别是在Twig中,这样的功能非常令人耳目一新( 因为我的模型是作为Doctrine实体构建的 ):
<p>{{ employee.getCurrentTask().description }}</p>
我现在面临的问题是,我觉得Symfony2并不是真正针对单个网页应用程序构建的。 一旦尝试添加一些Ajax功能,我就会遇到以下问题 :
然后,我研究了Knockout.js和Angularjs,但随后我却感觉丧失了Doctrine和Twig的所有优势。无论如何,我必须在客户端重建模型,然后将其维护在两个不同的位置。
所以我想出了这个主意:
但是,我该如何解决Symfony已经解决但无法使用Doctrine2 Relationships,Form Validation,CSRF等问题,但是如果使用前端js框架则无法使用?
欢迎提出所有建议!
关于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的特定问题吗?