更改 Symfony 自动装配别名的名称

Change the name of a Symfony autowire alias

我正在使用 Symfony 5.3 和 Symfony RateLimiter 包。

为此,应调用一个方法:

public function root(Request $request, RateLimiterFactory $authenticationApiLimiter)
{
}

A RateLimiterFactory 需要调用变量 $authenticationApiLimiter 才能正确自动装配。但是,此项目使用 snake_case 变量标准。

如何使用别名或更改它?

谢谢

我喜欢 Symfony 的大部分设计,但在自动命名事物时它们往往会有点忘乎所以。最好的全职解决方案确实是遵循 Symfony 标准并接受它。但是,如果您确实需要,可以使用 bind 来更改参数名称。

# config/services.yaml
services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
    
    # named alias    
    Symfony\Component\RateLimiter\RateLimiterFactory $anonymous_api: '@limiter.anonymous_api'

class DefaultController extends AbstractController
{
    #[Route('/', name: 'default')]
    public function index(RateLimiterFactory $anonymous_api): Response
    {
        return $this->render('default/index.html.twig', [
            'controller_name' => 'DefaultController',
        ]);
    }
}

除了命名别名,您还可以只使用绑定。我认为别名更具体一些,但它们都有效。

要找出服务 ID,首先创建一个新的 5.3 项目,安装 symfony/rate-limiter,然后将 rate_limiter.yaml 文件从文档复制到 config/packages。

bin/console debug:container RateLimiterFactory

 Select one of the following services to display its information:
  [0] Symfony\Component\RateLimiter\RateLimiterFactory $anonymousApiLimiter
  [1] Symfony\Component\RateLimiter\RateLimiterFactory $authenticatedApiLimiter
 > 0
Information for Service "limiter.anonymous_api"
===============================================

 ---------------- -------------------------------------------------- 
  Option           Value                                             
 ---------------- -------------------------------------------------- 
  Service ID       limiter.anonymous_api                             
  Class            Symfony\Component\RateLimiter\RateLimiterFactory  
  Tags             -         

limiter.anonymous_api是关键。您可以在命名别名中使用该服务。