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 期间的返回响应的主要内容,如果未能解决你的问题,请参考以下文章

yii2 beforeAction 重定向问题

PHP (Yii2) 自定义业务异常类(可支持返回任意自己想要的类型数据)

Yii2-自适应切换模板

Yii2 UrlManager打破期间

Yii2 403在ajax调用期间被禁止

Yii beforeAction 兼容性问题