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



On (Symfony 4) 如何从PHP代码中访问Liip Imagine bundle?我找到了使用Liip Imagine Cache的解决方案,但我无法让它工作。两种解决方案,都不适合我。我完全不知道为什么。

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

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

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

未找到服务"liip_imagine.cache.manager":即使它存在于应用程序的容器中,"App\Controller\MemberController"中的容器也是一个较小的服务定位器,它只知道"原则"、"form.factory"、"http_kernel"、"parameter_bag"、"request_stack"、"路由器"、"security.authorization_checker"、"security.csrf.token_manager"、"security.token_storage"、"序列化程序"、"会话"和"twig"服务。请尝试改用依赖关系注入。

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

在我的服务中,我有

app.imagine_cache_manager:
class: LiipImagineBundleImagineCacheCacheManager
arguments: ["@liip_imagine.cache.manager"]

在我的控制器中,我有

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

这导致我遇到同样的例外

未找到服务"app.imagine_cache_manager":即使它存在于应用程序的容器中,"App\Controller\MemberController"中的容器也是一个较小的服务定位器,它只知道"学说"、"form.factory"、"http_kernel"、"parameter_bag"、"request_stack"、"路由器"、"security.authorization_checker"、"security.csrf.token_manager"、"security.token_storage"、"序列化程序"、"会话"和"twig"服务。请尝试改用依赖关系注入。

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

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

您可以:

扩展控制器中的getSubscribedServices()功能,并将CacheManager作为服务之一包含在内。

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

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

您可以在公告中阅读有关此更改的信息

最新更新