CakePHP 3 — добавление промежуточного программного обеспечения для общих условий на некоторой конечной точке

#php #cakephp

#php #cakephp

Вопрос:

Я довольно новичок в CakePHP 3, и мне было интересно, как я мог бы этого добиться. В принципе, у меня есть пользовательский контроллер. Этот контроллер имеет несколько основных методов RESTful, и каждый из них проверяет допустимый метод запроса, прежде чем продолжить.

Например

 class UsersController extends AppController
{

    public function create()
    {
        if ($this->request->is('post') === false) {
            throw new BadRequestException('This API endpoint only accepts a POST request');
            return false;
        }

        if (empty($this->request->data) || !count($this->request->data)) {
            throw new BadRequestException('No POST data received');
            return false;
        }
    }

    public function update()
    {
        if ($this->request->is('post') === false) {
            throw new BadRequestException('This API endpoint only accepts a POST request');
            return false;
        }

        if (empty($this->request->data) || !count($this->request->data)) {
            throw new BadRequestException('No POST data received');
            return false;
        }
    }

    public function delete()
    {
        if ($this->request->is('post') === false) {
            throw new BadRequestException('This API endpoint only accepts a POST request');
            return false;
        }

        if (empty($this->request->data) || !count($this->request->data)) {
            throw new BadRequestException('No POST data received');
            return false;
        }
    }
}
  

Это выглядит довольно повторяющимся, и я думаю, что я мог бы создать промежуточное программное обеспечение, которое выполняет всю проверку запросов только для этих методов (т. Е., Если у меня есть index (), промежуточное программное обеспечение не будет применяться); однако я не уверен, как это можно сделать.

Любая помощь была бы очень признательна.

Ответ №1:

Вы можете использовать функцию инициализации контроллера для выполнения распространенных ошибок

 public function initialize(){
    parent::initialize();

    if (!$this->request->is('post')) {
        throw new BadRequestException('This API endpoint only accepts a POST request');
        return false;
    }

    if (empty($this->request->data) || !count($this->request->data)) {
        throw new BadRequestException('No POST data received');
        return false;
    }

}
  

Также вы можете указать методом, используя $this->request->params[‘action’], например

 if (!$this->request->is('post') amp;amp; in_array($this->request->params['action'], ['index','add','delete'])) {
        throw new BadRequestException('This API endpoint only accepts a POST request');
        return false;
    }
  

Надеюсь, это поможет вам