Так из-за 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 для конкретной операции или маршрута?
С уважением,
Рубен ван дер Линде
Вы можете вернуть экземпляр HttpFoundation Response
вместо $data
, Тогда ни один слушатель не зарегистрирован kernel.view
будет называться.
Но представляя слушателя, похожего на api_receive
для слушателя записи это хорошая идея. Не могли бы вы открыть запрос на извлечение?
Изменить: я открыл запрос на извлечение, чтобы ввести этот новый флаг: https://github.com/api-platform/core/pull/2072
Других решений пока нет …