【问题标题】:How can I get an object is every response in Symfony?Symfony 中的每个响应如何获取对象?
【发布时间】:2020-06-06 19:49:53
【问题描述】:

上下文

我的项目中有一个实体 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(),但这意味着直接从我的User 实体中使用CartRepository,恕我直言,感觉不对(我的意思是,我的实体是一个普通的对象,我觉得获取存储库不是一个好方法,是吗?)

所以我的问题是:有没有办法全局获取当前的购物车对象,这样我就可以在我的所有视图中拥有它,而无需在我的控制器中的任何单个 render() 方法中传递它?或者也许还有其他方法可以走?

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    假设您使用 twig 来呈现您的模板,您必须创建一个扩展。 将 twig 扩展声明为服务,您可以直接在服务构造函数中注入实体管理器或存储库。

    这里是 symfony 文档中有关如何创建 twig 扩展的文档:https://symfony.com/doc/current/templating/twig_extension.html

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

    【讨论】:

      【解决方案2】:

      即使 Twig 扩展看起来是一个可行的解决方案,我也会采取不同的做法:使用嵌入式控制器,您可以获得更多控制权。将购物车模板 sn-p 放在一个不同的文件中,创建一个渲染这个小块的控制器,并使用

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

      如果显示此信息的模板增加(例如,您想为空购物车使用一个图标,如果购物车中有东西则使用另一个图标),您会发现这比使用扩展

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-19
        • 1970-01-01
        • 2020-01-23
        • 2021-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多