Yii2-在操作之前返回响应

Edu*_*rdo 2 php yii2 yii-rest

我正在构建一个测试API。我创建了一个从yii \ rest \ Controller扩展的Controller Page。动作需要发送响应。

要访问此控制器中的操作,需要发布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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我可能有20个需要进行此验证的操作,有没有办法从beforeAction方法返回响应以避免重复代码?

rob*_*006 5

您可以设置响应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);
}
Run Code Online (Sandbox Code Playgroud)

  • @NikDow `render()` 和 `renderPartial()` 不配置响应对象,只返回渲染的内容。您需要手动执行此操作:`Yii::$app->response->content = $this->render($view, $data);`。 (2认同)