Я строю тестовый 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, чтобы избежать повторения кода?
Вы можете настроить ответ в 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);
}
возможно вставьте в beforeAction после $ this-> service = $ service;
if (empty($this->service)) {
echo json_encode(['code' => 'ERROR', 'message' => 'Service does not exist']);
exit;
}