创建DRY Symfony2控制器 - 列表

时间:2015-04-15 21:20:33

标签: php oop symfony controller dry

我的目标是通过创建3个文件(实体yml,列表树枝和编辑树枝)和编辑另外3个现有文件(services.yml,parameters.yml和routing.yml)来获得功能齐全的CRUD管理UI。

twigs将继承一个基本模板,确保上下文(标题,侧边栏,页脚,引导样式,javascripts等),而实体yml将需要doctriine:generate:entities命令,所以我可以将实体作为一个简单的php对象。

实施例

实体:

  • 作业:

    • 标题
    • 描述
    • ,直到
    • URL
  • 项目:

    • 标题
    • 状态:
    • URL:
    • 描述
  • 用户(继承FOSUserBundle实体):

    • 的clientId
    • clientSecret
    • socialNetwork
    • 简档
    • 化身

由于我希望我的代码是干的,我想我应该使用一个服务控制器,它可以获得一些setter Injection来满足要求。其中一个注入的对象是用于定义控制器配置的类(例如,要查询的存储库,在该存储库中使用的方法,要呈现的模板等),称为Configurator。

基于上面的实体示例,为了获得功能性的Job列表,我想我需要以下服务:

  • 存储库服务
  • 配置器服务
  • 控制器服务

在services.yml中,将为每个实体提供上述三种服务,这些服务都具有不同的名称。示例:admin.job.repository,admin.project.repository。乍一看,它不是很干,但只要您只需复制配置文件,我的幸运猜测是我仍然实现了我的主要目的。

示例:

Repository service:
admin.job.repository:
    class: Doctrine\ORM\EntityRepository
    factory_service: doctrine.orm.default_entity_manager
    factory_method: getRepository
    arguments:
        - AppBundle\Entity\Job

配置器服务:

admin.job.config.list:
    class: AppBundle\Configurator\ListControllerConfigurator
    arguments:
        - @admin.job.repository
        - "AdminBundle:Job:list.html.twig"
    calls:
        - [ setRepoMethod, ["findJobsForTimeline"] ]
        - [ setPerPage, [%knp_paginator.page_range%]]
        - [ setParameters, [%admin.job.list.parameters%]]

在Configurator中,我使用强制注入和setter的参数作为可选参数,在PHP中具有硬编码的默认回退。 (例如,findAll for repo,10 for perPage等。)

Controller service:
admin.job.controller.list:
    class: AdminBundle\ListController
    arguments:
        - @admin.job.config.list
    calls:
        - [setContainer, [@service_container] ]

路由配置:

admin_Job_list:
    path:     /{page}
    defaults: { _controller: admin.job.controller.list:listAction, page: 1 }
    requirements:
        page:  \d+

代码功能齐全,可以按预期呈现商品详情页面。

我的问题是:

  • 还有其他更好的方法来处理代码重复吗?在创造这个时,我从Sonata,EasyAdmin和其他类似的包中获得了灵感;所有这些都是成熟的,复杂的捆绑,但我想要的是一个具有教学(炫耀)目的的自制轮
  • 为什么在services.yml,routing.yml或parameters.yml中的任何更改后,任何请求需要5到30秒才能完成?从我所看到的,services.yml被翻译成app / cache / dev / appDevDebugProjectContainer.php中的普通PHP - 这是原因吗?

1 个答案:

答案 0 :(得分:2)

您可以创建自己的DI扩展程序。它基本上允许您指定自己的YML配置树以及如何从中生成服务/参数。您只能在YML中指定相关项,并且动态生成所有存储库/配置程序/控制器服务:

my_superior_crud:
    Job:
        fields:
            - Title
            - Description
            - From
            # ...
        template: 'AdminBundle:Job:list.html.twig'
        route_path: '/{page}'
        # ...
    # ...

这些扩展名简要提及in the docs,但您可以找到一些体面的文章(like this onethis one)。另请参阅现有扩展(twig非常容易理解)。

对于你的第二个问题,是的,它很可能是缓存生成。