2015-05-11 2 views
1

У меня есть метод проверки того, вошел ли пользователь в мой UserController. Мне нужен тот же метод во всех остальных контроллерах. Как я могу сделать то же самое без копирования, вставляющего код для всех контроллеров.Yii 2 использовать один и тот же метод контроллера/действие в нескольких контроллерах

Метод контроллер выглядит

public function is_logged_in() { 
 
\t  $session = Yii::$app->session; 
 
\t  $cookies = Yii::$app->request->cookies; 
 
\t  //print_r($session); 
 
\t  $session->open(); 
 
\t  $session_cookie_name = Yii::$app->params['cookie_name_session_var']; 
 
\t  $logged_in = false; 
 
\t  //echo "-memn-".$cook_name.' is halle - '; 
 
\t  //print_r($_SESSION); 
 
\t  if(($cook_name = $session->get($session_cookie_name))) { 
 
\t  \t //echo " - <pre>"; 
 
\t  \t //print_r($cookies); 
 
\t  \t //exit; 
 
\t  \t $write_cookies = Yii::$app->response->cookies; 
 
\t  \t //echo "</pre>"; 
 
\t  \t //echo $cookies->getValue($cook_name).' placenta'; 
 
\t \t  if($u_token = $cookies->getValue($cook_name)) { 
 
\t \t  \t echo "b"; 
 
\t \t \t \t if($u_token) { 
 
\t \t \t \t echo "c"; 
 
\t \t \t \t \t $write_cookies->remove($cook_name); 
 
\t \t \t \t \t unset($write_cookies[$cook_name]); 
 
\t \t \t \t \t $session->destroy(); 
 
\t \t \t \t \t $session->open(); 
 
\t \t \t \t \t $cookie_name = sha1($u_token).time(); 
 
\t \t \t \t \t $session[$session_cookie_name] = $cookie_name; 
 
\t \t \t \t \t $write_cookies->add(new \yii\web\Cookie([ 
 
\t    \t \t 'name' => $session[$session_cookie_name], 
 
\t    \t \t 'value' => $u_token, 
 
\t    \t \t 'expire' => time() + 6000000 
 
\t    \t ])); // around one hour expiry time 
 
\t    \t $session->close(); 
 

 
\t \t \t \t \t 
 
\t \t \t \t \t 
 
\t \t \t \t \t 
 
\t \t \t \t \t 
 
\t \t \t \t \t $logged_in = true; 
 
\t \t \t \t \t //echo $u_token; 
 
\t \t \t \t }  
 
\t \t  } 
 
\t  } 
 
\t  
 
\t  if(!$logged_in) { 
 
\t \t  $session->destroy(); 
 
\t  } 
 
\t  return $logged_in; 
 
    }

ответ

5

1) Вы можете создать свой собственный компонент, и поставить этот метод здесь или поместить его в модели (в зависимости от логики этого метода) , Компонент можно разместить, например, в папке components (по умолчанию он не существует). Затем просто используйте этот компонент в любых контроллерах, которые вы хотите.

2) Если этот код необходимо выполнить до или после определенных действий, вы можете использовать поведение.

3) Вы можете использовать наследование и создать свой собственный контроллер, который простирается от yii\web\Controller, объявить этот метод здесь и расширить все другие контроллеры, где вы собираетесь использовать эту логику из пользовательских один.

0

В дополнение к ответу арогачева ваш код действительно должен находиться в классе, который расширяет класс компонентов пользователя http://www.yiiframework.com/doc-2.0/yii-web-user.html, даже не говоря уже о том, что класс идентификации пользователя уже делает все, что делает ваш код (только намного, намного лучше). Он поставляется с функцией isGuest.

+0

Это действительно новая информация для меня –

+0

Посмотрите, это довольно приятно, и вы также можете расширить ее и внести свои изменения, после чего вы можете просто сказать yii использовать свой пользовательский компонент вместо стандартного. Это также интегрируется с фильтрами, которые yii имеет (например, действие, доступное только для входа в систему) –

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