2012-01-24 2 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 \ Controller \ 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. Вы можете настроить его в приложение/Config/security.yml под access_control: - {путь: ^/anyurl-формы/образец $, роль: ROLE_USER}

    с помощью этого метода: Symfony будет один для проверки действительности сеанса. и если сеанс недействителен, он автоматически перенаправит пользователя на страницу входа, и не прошедший проверку пользователя пользователь никогда не сможет посещать эти страницы, если не зарегистрирован.

    У реализации этого метода есть несколько вариантов, прежде чем он будет работать. Возможно, вам потребуется создать свой собственный поставщик или использовать и существующий, я рекомендую FOSUserBundle. Этот пакет имеет множество способов управления пользователем. Другой вариант - создать свой собственный Provider, если вы хотите проверить внешне специально, когда используете api's (SOA), чтобы проверить подлинность пользователя.

  2. Если вы хотите добавить метод, который будет использоваться для всех контроллеров.Это либо вы создаете класс, который расширяет контроллер Symfony в:

    класс BaseController расширяет контроллер { защищенная функция checkLogin() {} }

    класс контроллера по умолчанию распространяется BaseController { общественная функция testAction() { $ loggedIn = $ this-> checkLogin(); }}

Или вы можете создать черту и включить его в ваш контроллер.

trait ControllerTrait 
{ 
    protected function checkLogin(){} 
} 

class DefaultController extends BaseController 
{ 
     use ControllerTrait; 

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

Но я настоятельно рекомендую использовать брандмауэр в целях безопасности и предлагает много функциональных возможностей и проверки безопасности.

Смежные вопросы