我想用 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 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));
}
这样就可以了