从Controller访问Liip Imagine捆绑包-将服务分配给变量(Symfony 4)

时间:2019-06-10 14:12:42

标签: php dependency-injection symfony4 liipimaginebundle

(Symfony 4) How do I access the Liip Imagine bundle from within PHP code?上,我找到了一个使用Liip Imagine Cache的解决方案,但无法正常工作。两种解决方案,都不适合我。我完全不知道为什么。

当我尝试使用harmstyler的解决方案时

$imagineCacheManager = $this->get('liip_imagine.cache.manager');

在我的控制器中,然后收到ServiceNotFoundException

服务“ liip_imagine.cache.manager”未找到:即使它存在于应用程序的容器中,“ App \ Controller \ MemberController”内部的容器也是一个较小的服务定位器,仅了解“教义”,“表单”。 factory”,“ http_kernel”,“ parameter_bag”,“ request_stack”,“ router”,“ security.authorization_checker”,“ security.csrf.token_manager”,“ security.token_storage”,“ serializer”,“ session”和“ twig”服务。尝试改用依赖项注入。

所以我尝试了Alister Bulman的建议,将其手动注入到service.yaml中的类中,但这也不起作用。

在我的service.yaml中,

app.imagine_cache_manager:
    class: Liip\ImagineBundle\Imagine\Cache\CacheManager
    arguments: ["@liip_imagine.cache.manager"]

我的控制器中有

$imagineCacheManager = $this->get('app.imagine_cache_manager');

这导致我遇到相同的异常

  

未找到服务“ app.imagine_cache_manager”:即使它存在于应用程序的容器中,“ App \ Controller \ MemberController”内部的容器还是一个较小的服务定位器,仅知道“ doctrine”,“ form.factory” ,“ http_kernel”,“ parameter_bag”,“ request_stack”,“ router”,“ security.authorization_checker”,“ security.csrf.token_manager”,“ security.token_storage”,“ serializer”,“ session”和“ twig”服务。尝试改用依赖项注入。

[顺便说一句,我实际上想做的是:我有成员,每个成员都有一张图像。创建成员我有一个图像上传,并让Liip创建主图像的调整大小图像。当我删除图像或成员时,我当然也想通过Liip删除缓存的图像。这就是为什么我尝试让Liip缓存管理器能够获取缓存的图像路径以将其删除。另一种方法是使用事件监听器,但这对我来说都不起作用。我将在另一个问题中总结监听器方法。]

1 个答案:

答案 0 :(得分:2)

这是由于弃用Controller类作为Symfony4中控制器的基类。 现在推荐的AbstractController类使用较小的容器,仅通过ServiceSubscriberInterface声明了服务(您可以在AbstractController::getSubscribedServices()方法中查看默认情况下可用的服务)。 / p>

您可以:

在Controller中扩展getSubscribedServices()函数,并将CacheManager作为服务之一。

直接在控制器中注入服务(推荐):

namespace App\Controller;

use Liip\ImagineBundle\Imagine\Cache\CacheManager;

class MemberController extends AbstractController 
{
    public function __construct(CacheManager $liipCache)
    {
        $this->imagineCacheManager = $liipCache;
    }
}

您可以了解有关此更改in the announcement