api-платформа | Есть ли способ отключить WriteListener для конкретной операции или маршрута?

Так из-за api-platform.com Невозможно сгенерировать IRI для элемента типа Я попытался использовать другой подход и объявил о пользовательских операциях на моем пользовательском объекте для входа в систему, регистрации и сброса (так как я все еще хочу настраивать бизнес-логику для них). Так что первоначальная настройка этого в api-платформе довольно проста. Я добавил следующий код в свой пользовательский объект

 *      collectionOperations={
*          "register"={"route_name"="user_register","normalization_context"={"groups"={"registerRead"}},"denormalization_context"={"groups"={"registerWrite"}}},
*          "reset"={"route_name"="user_reset","normalization_context"={"groups"={"resetRead"}},"denormalization_context"={"groups"={"resetWrite"}}},
*          "login"={"route_name"="user_login","normalization_context"={"groups"={"loginRead"}},"denormalization_context"={"groups"={"loginWrite"}}},
*          "token"={"route_name"="user_token","normalization_context"={"groups"={"tokenRead"}},"denormalization_context"={"groups"={"token"}}}
*      },

А затем добавил соответствующие действия в пользовательский контроллер.

/**
* @Route(
*     name="user_login",
*     path="api/user/login",
*     methods={"POST"},
*     defaults={
*         "_api_resource_class"=User::class,
*         "_api_collection_operation_name"="login",
*         "_api_receive"=false
*     }
* )
*/
public function loginAction(User $data): User {

///$this->userService->login($data);

return $data;
}

/**
* @Route(
*     name="user_register",
*     path="api/user/register",
*     methods={"POST"},
*     defaults={
*         "_api_resource_class"=User::class,
*         "_api_collection_operation_name"="register",
*         "_api_receive"=false
*     }
* )
*/
public function registerAction(User $data): User {

///$this->userService->register($data);

return $data;
}

/**
* @Route(
*     name="user_reset",
*     path="api/user/reset",
*     methods={"POST"},
*     defaults={
*         "_api_resource_class"=User::class,
*         "_api_collection_operation_name"="reset",
*         "_api_receive"=false
*     }
* )
*/
public function resetAction(User $data): User {

//$this->userService->reset($data);

return $data;
}

/**
* @Route(
*     name="user_token",
*     path="api/user/token",
*     methods={"POST"},
*     defaults={
*         "_api_resource_class"=User::class,
*         "_api_collection_operation_name"="token",
*         "_api_receive"=false
*     }
* )
*/
public function tokenAction(User $data): User {

//$this->userService->reset($data);

return $data;
}

Пока все хорошо, однако ….. потому что мы используем операцию post здесь, а пользователь — это доктрина ORM, пакет api-platform атомарно добавляет запись в базу данных. Но я не хочу этого, я хочу, чтобы он передавал сущность контроллеру, который затем использует сервис для ведения бизнес-логики. И определите, если и как пост должен быть обработан.

Теперь я просмотрел документацию, и проблема, похоже, в том, что WriteListener всегда запускает, когда были другие триггеры (например, ReadListener, DeserializeListener и ValidateListener), которые можно отключить с помощью параметра _api_receive.

Таким образом, остается вопрос: есть ли способ отключить WriteListener для конкретной операции или маршрута?

С уважением,
Рубен ван дер Линде

0

Решение

Вы можете вернуть экземпляр HttpFoundation Response вместо $data, Тогда ни один слушатель не зарегистрирован kernel.view будет называться.

Но представляя слушателя, похожего на api_receive для слушателя записи это хорошая идея. Не могли бы вы открыть запрос на извлечение?

Изменить: я открыл запрос на извлечение, чтобы ввести этот новый флаг: https://github.com/api-platform/core/pull/2072

0

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector