Symfony 2 - FosrestBundle - Способ API вызова от другого контроллера
-
20-12-2019 - |
Вопрос
Я пытаюсь вызвать метод моей API, но я получаю это исключение:
FatalErrorException: Error: Call to undefined method
Project\Bundle\ApiBundle\Controller\UserController::userCreate() in
Symfony/src/Project/Bundle/UserBundle/Controller/UserController.php line 56
.
Я пытаюсь вызвать метод моей API для создания пользователя, чтобы не повторить один и тот же код дважды.API будет использоваться мобильным устройством.В браузере, когда пользователь пытается зарегистрироваться, он вызывает маршрут, который позвонит API создать пользователя.Это то, что я пытаюсь сделать ...
Если я добавлю прямо URL API для создания пользователя, он отлично работает. Генеракодицетагкод Но когда я называю этот метод в моем контроллере, как здесь:
public function registerAction()
{
$apiUserController = new \Moodress\Bundle\ApiBundle\Controller\UserController;
$answer = $apiUserController->userCreate();
return $this->redirect($this->generateUrl('moodress_home'));
}
.
Он не в состоянии найти мой метод UserCreate в Usercontroller ...
Вот мой usercontroller:
class UserController extends Controller
{
/**
* @Post("/user/create")
*/
public function userCreateAction()
{
$userManager = $this->get('fos_user.user_manager');
$jsonErrorCreator = $this->get('moodress_api.create_error_json');
$user = $userManager->createUser();
$user->setEnabled(true);
$request = $this->get('request');
$name = $request->request->get('name');
$email = $request->request->get('email');
$password = $request->request->get('password');
$verification = $request->request->get('verification');
// We check if all parameters are set
$code = 0;
if ($name === null) $code = 200;
else if ($email === null) $code = 201;
else if ($password === null) $code = 202;
else if ($verification === null) $code = 203;
else if ($password !== $verification) $code = 204;
else if ($userManager->findUserByUsername($name) !== null) $code = 205;
else if ($userManager->findUserByEmail($email) !== null) $code = 206;
if ($code != 0)
return ($jsonErrorCreator->createErrorJson($code, null));
// We set parameters to user object
$user->setUsername($name);
$user->setEmail($email);
$encoder = $this->get('security.encoder_factory')->getEncoder($user);
$password_user = $encoder->encodePassword($password, $user->getSalt());
$user->setPassword($password_user);
$clientManager = $this->get('fos_oauth_server.client_manager.default');
$client = $clientManager->createClient();
$client->setRedirectUris(array('http://localhost:8888/app_dev.php'));
$client->setAllowedGrantTypes(array('token', 'authorization_code'));
$clientManager->updateClient($client);
$user->setClient($client);
// We save the user in the database
$userManager->updateUser($user);
// We use the json service for returning the data
$jsonCreator = $this->get('moodress_api.create_json');
$response = $jsonCreator->createJson($user);
return $response;
}
.
Мы просто пытаемся позвонить в метод API и вернуть результат ... Какой лучший способ назвать методом FosrestBundle?
Спасибо
Решение
<Сильное> Решение:
Вы, вероятно, должны лучше использовать Переадресация вроде бы:
$response = $this->forward('AcmeYourBundle:User:userCreate', array());
// modify the response
return $response;
.
<Сильные> Объяснение:
Вы пытались вызвать несуществующие действия.
public function userCreateAction() { /* ... */ }
.
... который нужно назвать так:
$answer = $apiUserController->userCreateAction();
.
... вместо
$answer = $apiUserController->userCreate();
.
Не создавайте объекты контроллера вручную:
Далее вы не можете просто создать новый объект контроллера и использовать его мгновенно
$controller = new \Moodress\Bundle\ApiBundle\Controller\UserController();
.
Вам нужно - по крайней мере - ввести контейнер для вызовов $this->get('...')
на работу:
$controller->setContainer($this->container);
.
Вы должны сильно рефакторировать свой код, хотя ... Действие Way Way Tooth Lat.
<Сильные> Советы:
Как вы, кажется, довольно новые для Symfony - вот несколько других советов:
- .
- Вы должны создать тип входа в систему и использовать это вместо того, чтобы получить данные из запроса напрямую (или использовать, который уже предоставлен FosuserBundle)
- Вы должны добавить метаданные валидации на ваш класс пользователя и подтвердить его, используя службу Validator (пользовательские сопоставления, которые уже предоставляются FosuserBundle)
- есть jsonresponse класс, который вы можете использовать < / li>
- Коды состояния HTTP - это константы в классе запроса, который вы можете использовать
Просто используйте следующее:
use Symfony\Component\HttpFoundation\JsonResponse;
return new JsonResponse($data, JsonResponse::HTTP_OK); // 200
.