Zend Framework 2 REST API: хочу вызвать get() вместо getList()

Я строю RESTful API в Zend Framework 2. Мой маршрут article/person, Я знаю что если id не передается в URL, тогда он будет вызывать getList() метод, а не get(),

В моем случае я не сдаю id как параметр get или post, но я передаю его в заголовке HTTP. Как я использую id для выполнения операций с базой данных, я хочу, чтобы он позвонил get() метод, а не getList(), Как я могу настроить код, чтобы сделать это?

Можно ли указать точное имя метода для вызова в маршрутизации?

3 ответа

Решение

Я не передаю идентификатор как параметр get или post, но передаю его в заголовке HTTP

Это делает ваш REST недействительным, так что на самом деле он больше не REST. Поэтому вы не можете использовать RestfulAbstractController без настройки.

Вы можете написать свой собственный абстрактный контроллер или переопределить getIdentifier метод:

protected function getIdentifier($routeMatch, $request)
{
    $identifier = $this->getIdentifierName();
    $headers    = $request->getHeaders();

    $id = $headers->get($identifier)->getFieldValue();
    if ($id !== false) {
        return $id;
    }

    return false;
}

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

Обратите внимание, что это будет использоваться для запросов GET, PUT, PATCH, DELETE и HEAD, а не только для GET!

/редактировать:

getIdentifier метод вызывается в потоке, контроллер определяет, какой метод запустить. Обычно это так:

  1. Контроллер построен
  2. Контроллер dispatch называется (диспетчер диспетчерский)
  3. dispatch запускает событие "рассылка"
  4. Метод onDispatch слушает это событие
  5. В AbstractRestfulController метод пытается определить, какой метод вызвать

Для #5 он проверяет, например, является ли запрос запросом GET. Если это так, он проверяет, есть ли заданный идентификатор. Если так, то get() используется. Если нет, то getList() используется. Проверка "если есть заданный идентификатор" выполняется с getIdentifier() метод.

Если вы расширяете AbstractRestfulController своим собственным абстрактным контроллером и переопределяете getIdentifier()Вы можете определить свой собственный идентификатор. Таким образом, вы можете проверить заголовок вместо параметра маршрута или параметра запроса.

Override AbstractRestfulController чтобы иметь возможность настроить все функции, связанные с идентификатором.

class YourController extends AbstractRestfulController {

    //in the constructor, ensure that your id name is set to the header variable you are using
    public function __construct() {
        $this->identifierName = 'id'; // Override $identifierName value specified in AbstractRestfulController, if you need it
    }

    protected function getIdentifier($routeMatch, $request)
    {

        //first of all, check if the id is set in the $routeMatch params, this is, in the normal way
        $id= parent::getIdentifier($routeMatch, $request);     
        if ($id !== false) {
            return $id;
        }

        //if the id its not set, check out the headers 
        $id =  $request->getHeaders()->get($this->getIdentifierName())->getFieldValue();
        if ($id !== false) {
            return $id;
        }

        return false;
    }

}

Я думаю, что самый простой подход - вызвать метод get из метода getList.

public function getList(){
   // get id from header
   $id = $this->getRequest()->getHeaders()->get("id-header-field");
   if ($id){
       return $this->get($id);
   }
   else{ /* return list */}
}

public function get($id){
  return JsonModel($data);
}
Другие вопросы по тегам