如何使用 Symfony 访问树枝扩展中的全局服务功能?

How to access a global service function within a twig extension using Symfony?

我想要一个全局函数,它在所有控制器和 twig 扩展中都可用。 该函数目前看起来像这样:

namespace Symfony\Bundle\FrameworkBundle\Controller;

class BaseController extends Controller {

/**
 * Check if the user is assigned to one of the given airlines
 *
 * @param Array $airlines
 *
 * @return boolean
 */
public function HAS_AIRLINE(Array $airlines) {
    if ($airlines == null)
        return false;

    // Get current user
    $user = $this->get('security.context')->getToken()->getUser();

    foreach ($airlines as $airline) {
        if($user->hasAirline($airline))
        return true;
    }

    return false;
}

我在 BaseController.php 中实现了这个功能,所以我可以在所有其他控制器中使用它。到目前为止,这工作得很好。 现在我也想在树枝扩展中使用这个函数,但我不知道如何。我的树枝扩展中确实有以下功能:

/* 
 * Check if the current user has one of the given roles by using the function provided by the base controller
 */
public function hasAirline($airlines= Array())
{
    if($airlines == null)
        return false;

    // How can I now use the function from my BaseController?
    return HAS_AIRLINE($airlines);
}

我已经尝试将 BaseController 定义为服务并在 twig 扩展中使用该服务,但我做不到。

有人可以帮助我吗?我觉得我对 Symfony 还不了解,但是文档并没有真正帮助我。

谢谢, MRE

您可以移动 User 实体中的逻辑:

class User
{
    public function hasAirline($airlines)
    {
        foreach ($airlines as $airline)
        {
            if ($this->getAirlines()->contains($airline))
            {
                return true;
            }
        }

        return false;
    }
}

如果 getAirlines() return 来自 Doctrine2 的 ArrayCollection,这将起作用,这允许使用 contains() 方法。

然后你可以在控制器中使用这个:

public function HAS_AIRLINE(Array $airlines) {
    return $this->get('security.context')->getToken()->getUser()
        ->hasAirline($airlines);
}

或者在 Twig 中 app.user:

{{ set hasAirline = app.user.hasAirline(airlines) }}