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

Access Liip Imagine bundle from Controller - assign service to variable (Symfony 4)

上,我找到了使用 Liip Imagine Cache 的解决方案,但我无法让它工作。两种解决方案,它们都不适合我。我完全不知道为什么。

当我使用

尝试 harmstyler 的解决方案时
$imagineCacheManager = $this->get('liip_imagine.cache.manager');

在我的控制器中然后我得到一个 ServiceNotFoundException

Service "liip_imagine.cache.manager" not found: even though it exists in the app's container, the container inside "App\Controller\MemberController" is a smaller service locator that only knows about the "doctrine", "form.factory", "http_kernel", "parameter_bag", "request_stack", "router", "security.authorization_checker", "security.csrf.token_manager", "security.token_storage", "serializer", "session" and "twig" services. Try using dependency injection instead.

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

在我的 service.yaml 我有

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

在我的控制器中我有

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

这导致我遇到同样的异常

Service "app.imagine_cache_manager" not found: even though it exists in the app's container, the container inside "App\Controller\MemberController" is a smaller service locator that only knows about the "doctrine", "form.factory", "http_kernel", "parameter_bag", "request_stack", "router", "security.authorization_checker", "security.csrf.token_manager", "security.token_storage", "serializer", "session" and "twig" services. Try using dependency injection instead.

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

这是由于 Controller class 作为 Symfony4 中控制器的基础 class 弃用所致。 现在推荐的 AbstractController class 使用较小的容器,其中仅包含通过 ServiceSubscriberInterface 声明的服务(您可以查看 AbstractController::getSubscribedServices() 方法以了解哪些服务可用默认)。

您可以:

在您的控制器中扩展 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