Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii2-操作前的返回响应_Php_Yii2_Yii Rest - Fatal编程技术网

Php Yii2-操作前的返回响应

Php Yii2-操作前的返回响应,php,yii2,yii-rest,Php,Yii2,Yii Rest,我正在构建一个测试API。我已经创建了一个从yii\rest\Controller扩展的控制器页面。操作需要发送响应 class PageController extends Controller { public $service; public function beforeAction($action) { parent::beforeAction($action); if (Yii::$app->request->

我正在构建一个测试API。我已经创建了一个从yii\rest\Controller扩展的控制器页面。操作需要发送响应

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;
        }
    }
}
要访问此控制器中的操作,需要发布服务id值。如果存在,我需要评估该服务id是否存在,是否处于活动状态,是否属于登录的用户。如果验证失败,我需要发送响应

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;
        }
    }
}
我尝试使用beforeAction()来执行此操作,但问题是返回数据用于验证操作是否应继续

因此,我的临时解决方案是将服务对象保存在类属性中,以便在操作和返回响应中对其进行评估

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方法返回响应以避免重复代码?

可能在$this->service=$service之后粘贴beforeAction

if (empty($this->service)) {
    echo json_encode(['code' => 'ERROR', 'message' => 'Service does not exist']);
    exit;
}

您可以在
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);
}

使用
exit
是一个非常糟糕的主意-它会阻止整个框架流(事件、响应处理)。如果我正确地阅读了您的代码,$this->asJson只是将数组转换为json,但它没有发送正确的响应?,return false将停止要触发的操作,这是好的。我在考虑添加一个操作“actionNoService”,并使用$action->id==“noService”在操作之前添加一个条件,以避免评估此操作
asJson()
configure global response object-如果在
beforeAction()中返回
false
,它将用作响应。asJson可以工作,但是$this->render和$this->renderPartial会产生一个空白屏幕。知道为什么吗?@NikDow
render()
renderPartial()
不配置响应对象,只返回渲染内容。您需要手动执行此操作:
Yii::$app->response->content=$this->render($view,$data)