Yii2 - beforeAction 期间的返回响应
Posted
技术标签:
【中文标题】Yii2 - beforeAction 期间的返回响应【英文标题】:Yii2 - Return Response during beforeAction 【发布时间】:2018-06-24 16:57:01 【问题描述】:我正在构建一个测试 API。我创建了一个从 yii\rest\Controller 扩展的控制器页面。 Actions 需要发送响应。
要访问此控制器中的操作,需要发布 service_id 值。如果存在,我需要评估该 service_id 是否存在,它是否处于活动状态并且属于登录用户。如果验证失败,我需要发送响应。
我正在尝试使用 beforeAction() 来执行此操作,但问题是返回数据用于验证操作是否应该继续。
所以我的临时解决方案是将服务对象保存在 Class 属性中,以便在操作中评估它并返回响应。
class PageController extends Controller
public $service;
public function beforeAction($action)
parent::beforeAction($action);
if (Yii::$app->request->isPost)
$data = Yii::$app->request->post();
$userAccess = new UserAccess();
$userAccess->load($data);
$service = $userAccess->getService();
$this->service = $service;
return true;
public function actionConnect()
$response = null;
if (empty($this->service))
$response['code'] = 'ERROR';
$response['message'] = 'Service does not exist';
return $response;
但我可能有 20 个需要此验证的操作,有没有办法从 beforeAction 方法返回响应以避免重复代码?
【问题讨论】:
【参考方案1】:您可以在beforeAction()
中设置响应并返回false
以避免操作调用:
public function beforeAction($action)
if (Yii::$app->request->isPost)
$userAccess = new UserAccess();
$userAccess->load(Yii::$app->request->post());
$this->service = $userAccess->getService();
if (empty($this->service))
$this->asJson([
'code' => 'ERROR',
'message' => 'Service does not exist',
]);
return false;
return parent::beforeAction($action);
【讨论】:
如果我正确阅读了您的代码,$this->asJson 只是将数组转换为 json,但它没有发送正确的响应?返回 false 将停止要触发的操作,这很好。我正在考虑添加一个动作“actionNoService”并使用 $action->id == “noService”向 beforeAction 添加一个条件以避免评估此动作asJson()
配置全局响应对象 - 如果您在 beforeAction()
中返回 false
,它将用作响应。试试看吧。
asJson 可以工作,但是 $this->render 和 $this->renderPartial 会产生一个空白屏幕。知道为什么吗?
@NikDow render()
和 renderPartial()
不配置响应对象,只返回渲染的内容。您需要手动执行此操作:Yii::$app->response->content = $this->render($view, $data);
。【参考方案2】:
也许在 $this->service = $service; 之后粘贴 beforeAction;
if (empty($this->service))
echo json_encode(['code' => 'ERROR', 'message' => 'Service does not exist']);
exit;
【讨论】:
使用exit
是一个非常糟糕的主意——它会破坏整个框架流程(事件、响应处理)。以上是关于Yii2 - beforeAction 期间的返回响应的主要内容,如果未能解决你的问题,请参考以下文章