2014-10-27 91 views
0

我目前正在设计一个基于Symfony框架的新Web应用程序,它将同时提供Web和移动访问。为了便于说明,我将使用Symfony框架中的默认AcmeDemoBundle来详细说明我的问题。Symfony2 Web服务

所以,DemoBundle给我下面的路线:

/hello/{name} 

到目前为止好。现在,我想实现在这个项目中,将成为移动应用的API,因此对于相同的控制器所路线的路线上面对子级是,例如:

/api/v1/hello/{name} 

我的疑问是:什么是最好的方式这样做没有复制代码?我打算使用API​​的FOSRestBundle,并且我知道他处理呈现HTML视图,但是我希望将API路由与Web分开,就像我之前提到的那样。也许我应该为API创建一个新的包?

+0

这真的取决于你的目的。为API分开捆绑看起来很好的决定。但是,如果你需要(web和api)返回相同的数据(但格式不同),我认为这不是一个好主意,因为如果有任何改变,你将不得不做两次更改。 您可以在路线中使用{格式}来管理可能的渲染方式或其他。 – Alex 2014-10-28 06:25:44

+0

是的,你说的关于不是一个好主意分开捆绑API是有道理的......但尽管FOSRestBundle使用{format}参数处理路由,但它不完全是我想要的,因为路由对于web和API,只有{格式}有区别。但我会更深入地了解有关路线的捆绑文档... – 2014-10-29 12:46:56

回答

0

为API创建捆绑包并不是一种好的做法,原因很简单,因为您无法在其他项目中轻松地重新使用该捆绑包。

例如,您为您的A项目创建PostBundle及其API绑定APIPostBundle。 如果您想为B项目使用该捆绑包,则需要PostBundle和APIPostBundle。你创建了两个bundle之间的依赖关系,这是一个糟糕的做法(Component-Based Development).

所以,你必须生成一个独立束与强度体系结构,如果你必须允许你少修改。 针对逻辑指令使用服务。然后,controller/APIController可以管理该路线并将调用服务方法。通过这种方式,您可以修改服务而无需编辑控制器。

所以,你的架构看起来像这样:

PostBundle 
    Controller 
    - PostController 
    - APIPostController 
    Service 
    - PostService 
    - PostServiceInterface 
+0

感谢Gura,我会尝试您的建议......我认为这种服务方式更适合在我所需要的,因为我可以用更多的功能和更独立的Web应用程序和API之间的路线。 – 2014-10-29 12:51:30