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

时间:2015-03-30 18:17:58

标签: php 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

1 个答案:

答案 0 :(得分:1)

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

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

        return false;
    }
}

如果getAirlines()从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) }}