我有一个方法检查用户是否在我的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;
}
答案 0 :(得分:5)
1)您可以创建自己的组件并将此方法放在此处或将其放在模型中(取决于该方法的逻辑)。组件可以放在例如for x in range(10000):
q.get()
文件夹中(默认情况下它不存在)。然后在您想要的任何控制器中使用此组件。
2)如果需要在某些操作之前或之后执行此代码,则可以使用行为。
3)您可以使用继承并创建从output_p, input_p = Pipe()
for x in range(10000):
input_p.send("hello")
扩展的自定义控制器,在此处声明此方法并将所有其他控制器扩展到您将从自定义中使用此逻辑的位置之一。
答案 1 :(得分:0)
除了arogachev的回答之外,你的代码实际上应该放在一个扩展User组件类http://www.yiiframework.com/doc-2.0/yii-web-user.html的类中,甚至没有提到用户标识类已经完成了你的代码所做的一切(只有很多) , 好多了)。它带有isGuest功能。