2012-01-24 43 views
8

我在控制器中有一個方法,就像這樣。事實上,我需要聲明函數checkLogin,這樣我可以在幾個控制器方法使用如下:Symfony 2在控制器方法中調用函數

class DefaultController extends Controller 
{ 
/** 
    * @Route("/test") 
    * @Template() 
    */ 
    public function testAction() 
    { 

     if (checkLogin()){} 
      else {} 
     exit; 
    } 

    public static function checkLogin() 
    { 
     return 1; 
    } 
} 

在上述情況下,當我做這樣的,我越來越以下錯誤:

致命錯誤:調用未定義的函數NouPei \ WebSiteBundle \控制器\ checkLogin()在/home/noor/noupei/website/WebSiteBundle/Controller/DefaultController.php上線142

+4

這是糟糕的軟件設計。你不應該把它放在控制器中。 –

回答

21

這是一個方法,而不是一個函數:

if (self::checkLogin()){} 
5

對於帳戶在Symfony 2中管理,你應該使用symfony 2的安全管理(here)。你將能夠檢查用戶登錄這樣的:

public function indexAction() 
{ 
    // show different content to admin users 
    if ($this->get('security.context')->isGranted('ADMIN')) { 
     // Load admin content here 
    } 
    // load other regular content here 
} 

Source

如果你不想使用Symfony的2安全管理,你應該使用services使適用於所有控制器的方法。

+0

沒有忘了登錄,我希望能夠調用 – Noor

+0

您是百達能的方法中調用函數的方法中的其他功能...我不明白你的意思 – BlackCharly

17

你可以調用該函數是這樣的:

$this->checkLogin(); 
1

有幾種方法可以做到這一點:

  1. 使用Symfony提供的防火牆。您可以在應用程序對其進行配置/配置/ security.yml 的ACCESS_CONTROL下: - {路徑:^/anyurl表格/模式$,作用:ROLE_USER}

    使用這種方法: symfony會是驗證會話有效性的一個。如果會話無效,它將自動將用戶重定向到登錄頁面,如果未登錄,未經身份驗證的用戶將永遠無法訪問這些頁面。

    實施此方法有幾個選項之前,它將工作。您可能需要創建自己的提供商或使用方法,並且我建議您使用現有的提供商或FOSUserBundle。該軟件包提供了有關如何管理用戶的多種功能。另一種選擇是創建您自己的Provider,如果您要在使用api的(SOA)檢查用戶的真實性時特別驗證外部特殊情況。

  2. 如果您想要添加將用於所有控制器的方法。這是不是您創建一個擴展的Symfony的控制器類:

    類BaseController擴展控制器 { 保護功能checkLogin(){} }

    類DefaultController擴展BaseController { 公共職能testAction() { $ loggedIn = $ this-> checkLogin(); }}

或者你可以創建一個特點,它包括在你的控制器。

trait ControllerTrait 
{ 
    protected function checkLogin(){} 
} 

class DefaultController extends BaseController 
{ 
     use ControllerTrait; 

     public function testAction() 
     { 
     $loggedIn = $this->checkLogin(); 
     } 
} 

但我強烈建議使用防火牆出於安全目的,它提供了很多功能和安全檢查。

相關問題