【问题标题】:Yii2 - Return Response during beforeActionYii2 - 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 方法返回响应以避免重复代码?

【问题讨论】:

    标签: php yii2 yii-rest


    【解决方案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 是一个非常糟糕的主意——它会破坏整个框架流程(事件、响应处理)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    相关资源
    最近更新 更多