2015-03-30 54 views
1

我想有一個全局功能,它可以在所有控制器以及樹枝擴展中使用。 功能目前看起來是這樣的:如何使用Symfony訪問樹枝擴展中的全局服務功能?

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作爲一種服務,並在樹枝推廣使用這項服務,但我不能管理。

有人能幫我嗎?我覺得我還沒有理解Symfony的一些東西,但是這些文檔並沒有真正幫助我。

謝謝 MRE

回答

1

你可以在你User實體移動邏輯:

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

     return false; 
    } 
} 

這將工作,如果getAirlines()返回ArrayCollection從Doctrine2,這允許使用contains()方法。在樹枝app.user

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

或者:

然後你就可以在控制器中使用這個

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

謝謝夥計! – MRE 2015-04-01 12:24:36