如何获得对象是Symfony中的每个响应?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获得对象是Symfony中的每个响应?相关的知识,希望对你有一定的参考价值。

上下文

我在我的项目中有一个实体User和一个实体Cart。两个实体之间存在ManyToOne关系:

/* /src/Entity/User.php */

/**
* @ORM\OneToMany(targetEntity="App\Entity\Cart", mappedBy="user", orphanRemoval=true)
*/
private $carts;
/* /src/Entity/Cart.php */

/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="carts")
* @ORM\JoinColumn(nullable=false)
*/
private $user;

我在CartRepository中也有一个返回用户当前购物车的方法。

/*src/Repository/CartRepository.php */

/**
* @param User $user
* @return mixed
* @throws NonUniqueResultException If the user somehow has several non-validated
* carts bidden to their account.
*/
public function findCurrentUserCart(User $user)
{
    /* ... */
}

我的问题

我想做的是能够轻松访问当前用户购物车中购物车项目的当前计数,因此我可以在导航栏中显示它。为此,我需要能够轻松访问用户的当前购物车。

我曾考虑过通过控制器来获取它,但是这似乎很烦人,因为在站点的所有页面上都要求提供信息(因为它在导航栏中),所以我需要从每个操作中检索计数的控制器。

然后我想到在User实体中具有一个简单的功能,例如getCartTotalCount(),但这意味着直接从我的CartRepository实体中使用User,恕我直言,这是错误的(我的意思是,我的实体是普通对象,我觉得获取存储库不是一个好方法,是吗?]

所以我的问题是:是否有一种方法可以全局获取当前的购物车对象,因此可以在我的所有视图中使用它,而无需在控制器中的任何单个render()方法中传递它?也许还有另一种路要走?

答案
假设您正在使用树枝渲染模板,则必须创建一个扩展名。将小枝扩展声明为服务,您可以直接在服务构造函数中注入实体管理器或存储库。

这是有关symfony文档的文档,其中介绍了如何创建树枝扩展名:https://symfony.com/doc/current/templating/twig_extension.html

在这种情况下,您需要创建一个自定义的树枝函数。

另一答案
即使Twig扩展看起来像一个可行的解决方案,我也会做不同的事情:使用嵌入式控制器,您将拥有更多的控制权。将购物车模板代码段放置在一个单独的文件中,创建一个呈现此小片段的控制器,然后使用进行调用

{{ render(controller( 'App\\Controller\\CartController::cartNavbar' )) }}

如果显示此信息的模板增加了(例如,您要为空购物车使用一个图标,如果要在购物车中放置一个图标,则为另一个),您会发现,与使用扩展名    

以上是关于如何获得对象是Symfony中的每个响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何从片段中的 JSON 响应中的对象获取数据

Symfony 4 JWT:访问 api 时我无法从控制器获得响应

如何跳过查询条件片段中的空对象?

为什么我不能在此片段中生成唯一对象数组?

如何在ios中发布对象并获得响应

操作栏项目是可点击的,但不响应片段中的事件