Yii2 — обратный ответ во время beforeAction

Я строю тестовый API. Я создал страницу контроллера, которая простирается от yii \ rest \ Controller. Действия должны отправить ответ.

Для доступа к действиям в этом контроллере необходимо опубликовать значение 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, чтобы избежать повторения кода?

0

Решение

Вы можете настроить ответ в 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);
}
2

Другие решения

возможно вставьте в beforeAction после $ this-> service = $ service;

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

По вопросам рекламы [email protected]