我正在尝试构建一个交互式Web应用程序来管理公司资源。
我有Symfony2的经验,但我用这个新的应用程序打了墙。
我想使这个应用程序在客户端相当互动。几乎完整的单一网页应用程序。
我以前的Web应用程序通常只会使用具有CRUD页面的典型MVC模式。
在这些简单的应用程序中,我会有
/employees/ /employees/create /employees/detail/45 /employees/update/45 /employees/delete/45
在这种应用中使用symfony会给我很多的优势:
>路由
>安全(CSRF令牌)
> FormTypes和Form处理
>验证
>与学说融合
>枝
特别是在Twig中这样的功能非常清爽(因为我的模型被构建为Doctrine实体):
<p>{{ employee.getCurrentTask().description }}</p>
我现在面临的问题是,我觉得Symfony2并不是真正为单一网页应用程序构建的。一旦我尝试添加一些Ajax功能,我遇到了这些问题:
> CSRF令牌无效
> jQuery中不可重复使用的视图/表示逻辑
>在html中添加数据属性来获取id等等…
然后我看着Knockout.js和Angularjs,但是我觉得失去了教条和枝条的所有优点。我必须在客户端重建我的模型,并且必须在两个不同的位置保持它们。
所以我想出了这个想法:
>使用Symfony2模型和控制器将数据保存到数据库,但是让symfony中的控制器只发送JSON并接收JSON(FOSRestBundle可能?)
>使用像AngularJS或KnockoutJS这样的框架在客户端重建JSON数据,以使用双向绑定。
但是,如何处理问题,如Doctrine2关系,表单验证,Symfony已经解决的CSRF,但如果我使用前端js框架,则无法使用?
欢迎所有的建议!
西蒙,我面临着同样的问题和问题。首先喜欢肯已经提到过。您不需要重建任何模型。更好地使用FosRestBundle和/或JMS Serializer。它将关系转换成JSON对象。这个对象通过api传输到你的前端,你可以像在twig一样使用它们,当你使用这样的angular.js
{[{ user.username }]}
与树枝一样。但请记住,您必须为角度设置自定义括号,因为默认情况下它使用与twig相同。
路由
你谈论一个单一的页面应用程序,所以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>
AngularJ将知道要触发的前端控制器。很好的东西,没有页面重新加载。还可以看看FosJSRoutingBundle.它允许您在javascript中生成symfony路由,我使用它们将js控制器与数据推入的html模板进行链接。
FormTypes,Form处理,验证
那么当你使用像cornerjs这样的前端框架时,你的symfony表单类型是无用的。但我不确定记住数据是通过api推送和拉出来的,我认为这对于形式类型来处理这种混杂是一件困难的事情。
对于验证,您可以使用angular的实时验证,或者在后台使用symfony的验证,没有问题。使用客户端和服务器端验证可能是一件好事。
枝条
树枝脱离了比赛。所有数据都在客户端呈现,而不是像服务器一样在服务器端渲染。但是,如果您的应用程序确实是单页应用程序,那只是这种情况。当然,你可以使用twig,但只有重新加载整个页面时才会刷新。
与教义融合
您仍然可以在后台使用原则。你有关于教义和SPA的具体问题吗?