Каков наилучший способ возвращать сообщения проверки с помощью Phalcon PHP в формате json

#php #rest #validation #phalcon #phalcon-orm

#php #отдых #проверка #phalcon #phalcon-orm #rest

Вопрос:

Я создаю REST API, и я хочу возвращать сообщения из проверки.

Вот пример с регистрацией пользователя:

 class Users extends PhalconMvcModel {
    public function validation() {
        $validator = new Validation();

        $validator->add('email', new PresenceOf([
                    'message' => 'The email is required'
        ]));
        $validator->add('email', new Email([
                    'message' => 'Invalid email given'
        ]));
        $validator->add('email', new Uniqueness([
                    'message' => 'Sorry, The email was registered by another user'
        ]));
        return $this->validate($validator);
}
  

Вот мой текущий код:

 class UserController extends PhalconMvcController {
    public function register() {
        $data = $this->request->getJsonRawBody();
        $user = new Users();
        $user->setEmail($data->email)->setUsername($data->username)->setPassword($data->password);
        if ($user->save() === false) {
            $data = [];
            $messages = $user->getMessages();
            foreach ($messages as $message) {
                $data[] = array(
                    'field' => $message->getField(),
                    'type' => $message->getType(),
                    'message' => $message->getMessage()
                );
            }
            return $this->response->setStatusCode(409, 'Conflict')->setJsonContent(array('error' => $data));
        }
        return $this->response->setStatusCode(201, 'Created')->setJsonContent(array('message' => "User id:" . $user->getId() . " created"));
}
  

Когда я меняю этот цикл for на что-то подобное, я получаю пустой ответ:

 return $this->response->setStatusCode(409, 'Conflict')->setJsonContent(array('error' => $user->getMessages()));
  

Вопрос в том, возможно ли сделать этот код короче без сообщений через цикл, а просто вернуть объект json.

Ответ №1:

Вы можете сделать это с очень небольшими изменениями, расширив методы по умолчанию. Вот рабочий пример вашего кода:

 // BaseModel class which overwrites default Phalcon methods if needed.
class BaseModel extends PhalconMvcModel
{ 
    public function getMessagesNormalized()
    {
        $messages = parent::getMessages();
        $data = [];
        foreach ($messages as $message) {
            $data[] = array(
                'field' => $message->getField(),
                'type' => $message->getType(),
                'message' => $message->getMessage()
            );
        }
        return $data;
    }
}

// Note that your models from now on extend BaseModel which extends PhalconMvcModel
class Users extends BaseModel {
    // ...
}

// Your controller
class UserController extends PhalconMvcController {
    public function register() {
        $data = $this->request->getJsonRawBody();
        $user = new Users();
        $user->setEmail($data->email)->setUsername($data->username)->setPassword($data->password);
        if ($user->save() === false) {
            $data = [];
            // Get the messages in RESTsuitable format
            $messages = $user->getMessagesNormalized();
            return $this->response->setStatusCode(409, 'Conflict')->setJsonContent(array('error' => $data));
        }
        return $this->response->setStatusCode(201, 'Created')->setJsonContent(array('message' => "User id:" . $user->getId() . " created"));
}
  

Комментарии:

1. Спасибо, теперь работает отлично. Я внес небольшое изменение при возврате к: return $this-> response-> setStatusCode(409, ‘Conflict’)->setJsonContent(array(‘error’ => $user-> getMessagesNormalized()));