Php Yii2-操作前的返回响应
我正在构建一个测试API。我已经创建了一个从yii\rest\Controller扩展的控制器页面。操作需要发送响应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->
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会产生一个空白屏幕。知道为什么吗?@NikDowrender()
和renderPartial()
不配置响应对象,只返回渲染内容。您需要手动执行此操作:Yii::$app->response->content=$this->render($view,$data)代码>。