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

Так что из-за 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 для определенной операции или маршрута?

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

1 Ответ

0 голосов
/ 05 июля 2018

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

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

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

...