Yii 2在多个控制器中使用相同的控制器方法/动作

Jin*_*iel 2 yii-components yii2 yii2-advanced-app

我有一个方法检查用户是否在我的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;
    }
Run Code Online (Sandbox Code Playgroud)

aro*_*hev 5

1)您可以创建自己的组件并将此方法放在此处或将其放在模型中(取决于该方法的逻辑).组件可以放在例如components文件夹中(默认情况下它不存在).然后在您想要的任何控制器中使用此组件.

2)如果需要在某些操作之前或之后执行此代码,则可以使用行为.

3)您可以使用继承并创建从中扩展的自定义控制器,yii\web\Controller在此处声明此方法并将所有其他控制器扩展到您将从自定义控制器中使用此逻辑的位置.