gpt4 book ai didi

controller - Symfony: Controller 工厂

转载 作者:行者123 更新时间:2023-12-04 02:16:50 25 4
gpt4 key购买 nike

我正在制作一个自定义用户包,允许定义多个用户类型,以及他们自己的存储库、管理器、提供者等。所以,我决定,而不是创建有限的 Controller 集,而是创建一个 Controller 工厂,这将产生 Controller 基于定义的用户类型和配置。但这提出了一个重要的问题——这些工厂应该在哪里以及如何运作?

现在,请注意,在工厂中创建 Controller 是不够的,我们还必须在某处为其设置所有路由。

问题是 - 最好的架构是什么?

在选择我将放置代码的层时,我正在考虑,其中包括:

  • 在扩展的 load 中加载工厂定义方法,并在那里创建所有 Controller 。问题:路由器在那里不可用,因为它发生在容器构建之前,所以我无法在同一个地方创建路由。
  • Sooo...也许在编译器传递中?但是编译器传递无法访问配置...我的意思是...实际上它有,如果我只是加载配置并手动处理它,但我仍然不确定这是否是一个好地方,但我我现在倾向于这个解决方案。

  • 在创建路由时:
  • 我应该在 Controller 工厂中放置路由创建逻辑吗?但是我将 Controller 创建为服务,工厂无权访问创建的 Controller 的 serviceId,并且创建路由需要 serviceId,所以不行。
  • 在 Controller 本身?我的意思是,这就是注释路由的工作方式,所以它可能是可行的。 Controller 必须实现类似我自己的 ControllerInterface与方法 getRoutes ,并且外部服务/编译器传递需要首先创建一个 Controller 作为服务,然后从所述 Controller 获取路由,修改它们,因此它们会引用此 Controller 的 serviceId 并将它们添加到路由器......无论如何乱七八糟的这个样子。
  • 还有其他选择吗?

  • 非常缺乏关于这种特殊模式的信息 - Controller 工厂 :) 。

    最佳答案

    The first version of API Platform正在使用类似的技术。

    第一步是注册路由。路由将 URL 模式映射到在 _controller 下定义的 Controller 路由的属性。这就是 Routing 组件和 HttpKernel 组件如何链接在一起(这两个组件之间没有强耦合)。
    可以通过创建 RouteLoader 来注册路由。 :http://symfony.com/doc/current/routing/custom_route_loader.html

    例如,API 平台、Sonata 和 Easy Admin 就是这样工作的。

    在运行时,在 _controller 下指定的可调用对象属性将被执行。它将接收参数中的 HTTP 请求并返回一个 HTTP 响应。如果需要,它可以访问其他服务(甚至容器)。

    Controller 可以是任何可调用的(方法、函数、可调用类...),但由于以下语法 my_controller_service:myAction,它也可以是服务(见 http://symfony.com/doc/current/controller/service.html)。

    DependencyInjection 组件允许使用工厂构建服务:http://symfony.com/doc/current/service_container/factories.html .工厂方法可以接收其他服务或参数(config)。

    总结:

    1/使用您的工厂为您的 Controller 注册服务定义以构建它,如下所示:

    # app/config/services.yml
    services:
    # ...

    app.controller_factory:
    class: AppBundle\Controller\ControllerFactory
    arguments: ['@some_service', '%some_parameter%]

    app.my_controller:
    class: AppBundle\Controller\ControllerInterface
    factory: 'app.controller_factory:createController'
    arguments: ['@some_service', '%some_parameter%]

    当然,如果需要,可以在 AppBundle\DependencyInjection\AppBundleExtension 中以编程方式创建 Controller 定义。类(class)。您也可以使用 abstract服务定义以避免代码重复( http://symfony.com/doc/current/service_container/parent_services.html )。

    2/创建一个 RouteLoader服务注册您的 Route实例。你可以看看这个例子: https://github.com/api-platform/core/blob/1.x/Routing/ApiLoader.php

    然后,将此路由加载器注册为服务:
    # app/config/services.yml
    services:
    app.routing_loader:
    class: AppBundle\Routing\MyLoader
    arguments: ['@some_service', '%some_parameter%]
    tags:
    - { name: routing.loader }

    3/告诉路由器执行这个 RouteLoader :
    # app/config/routing.yml
    app:
    resource: . # Omitted
    type: mytype # Should match the one defined in your loader's supports() method

    全部完成!

    (我是 Symfony 核心团队的成员,也是 API 平台的创建者,所以这是一个固执的答案。)

    关于controller - Symfony: Controller 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39097005/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com