Yii 2 использует один и тот же метод/действие контроллера в нескольких контроллерах

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

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

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

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


person Jinu Joseph Daniel    schedule 11.05.2015    source источник


Ответы (2)


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

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

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

person arogachev    schedule 11.05.2015

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

person Mihai P.    schedule 12.05.2015
comment
Это действительно новая информация для меня - person Jinu Joseph Daniel; 12.05.2015
comment
поищите, это довольно приятно, и вы также можете расширить его и внести свои собственные изменения, после чего вы можете просто указать yii использовать ваш пользовательский компонент вместо стандартного. Это также интегрируется с фильтрами, которые есть в yii (например, делает действие доступным только для зарегистрированных пользователей). - person Mihai P.; 13.05.2015