控制器的方法中没有捆绑的服务(autowire)。

问题描述 投票:-1回答:1

我想用 https:/github.comtediousTedivmStashBundle。 在我的symfony 4项目中的bundle。由作曲家添加,在 configstash.yaml 文件,并且根据profiler栏,它基本上是工作的。

现在,我想在我的控制器中使用缓存值。我尝试在控制器中添加服务 储藏 由它的名字到方法的参数,使用和例子中说的一样的名字。

$pool = $this->container->get('stash');

但框架没有找到这个服务。它也不能像例子中解释的那样被添加。

我如何在symfony 4应用中把这个bundle作为服务使用(自动连接)?

更新

services.yaml:

  stash.default_cache:
    class: Tedivm\StashBundle\Service\CacheService
    public: true
    arguments:
      $name: 'stash'

  Tedivm\StashBundle\Service\CacheService: '@stash.default_cache'

Controller:

public function something(Request $request, CacheService $service, ...

现在看起来可以用了 :)

感谢 @Cerad 的建议(以及后来的正确解决方案)。

symfony
1个回答
2
投票

下面是一个例子,说明在处理还没有完全准备好的捆绑包时,如何处理这类问题。

首先安装一个测试项目。

symfony new --full stash --version=lts
composer require tedivm/stash-bundle

请注意,这个bundle并不直接支持Symfony 5,因此使用了lts。 还需要注意的是,该bundle不支持Flex,所以你必须根据bundle的readme文件添加自己的configpackagesstash.yaml文件。

# config/packages/stash.yaml
stash:
  drivers: [ FileSystem ]
  FileSystem: ~

在这一点上,我们可以确定我们需要注入哪些服务。

bin/console debug:container stash
Information for Service "stash.default_cache"
=============================================

 Class CacheService

 ---------------- ----------------------------------------- 
  Option           Value                                    
 ---------------- ----------------------------------------- 
  Service ID       stash.default_cache                      
  Class            Tedivm\StashBundle\Service\CacheService  

大多数情况下,你会希望使用一个接口来进行注入,但是偷看一下源代码就会发现,这个捆绑包并没有使用接口。 顺便说一句,把第三方服务叫做'stash'不是一个好主意。 它真的应该是'tedivm.stash',但我离题了。

现在我们可以创建一个别名,然后对它进行类型提示。

# config/services.yaml
    Tedivm\StashBundle\Service\CacheService : '@stash' # alias for typehinting

# Controller class
    public function index(CacheService $cacheService)
    {
        return new Response('Cache ' . get_class($cacheService));
    }

这样就可以了

© www.soinside.com 2019 - 2024. All rights reserved.