심포 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 에 대한 사용자 만들기,그것은 완벽하게 작동합니다.app_dev.php/api/user/create
하지만 내가 이 메소드를 호출에 콘트롤러는 다음과 같은 여기:
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;
}
기 위해 노력하고 있을 뿐입니다 call API 방법이 다시 얻을 결과를...는 가장 좋은 방법은 무엇입을 위한 메소드를 호출하의 FOSRestBundle?
감사
해결책
솔루션:
당신은 아마 더 나은 사용 송 다음과 같다:
$response = $this->forward('AcmeYourBundle:User:userCreate', array());
// modify the response
return $response;
설명:
당신을 호출하려고 비 existant 작업입니다.
public function userCreateAction() { /* ... */ }
...해야 하는 이라는 다음과 같다:
$answer = $apiUserController->userCreateAction();
...대
$answer = $apiUserController->userCreate();
을 만들지 않 컨트롤러 개체를 수동으로:
더할 수 없을 만든 새로운 컨트롤러 개체고 그것을 사용하는 즉시
$controller = new \Moodress\Bundle\ApiBundle\Controller\UserController();
당신이 필요하에 최소 주입에 대한 컨테이너 $this->get('...')
전화 작업:
$controller->setContainer($this->container);
해야 합 많 리팩터 코드 하지만...작업입니다 방법 너무 뚱뚱하다.
tips:
으로 당신은 것을 보는 새로운 시도로 심포-여기에는 다른 몇 가지 팁:
- 을 만들어야 합 로그인 형태의 유형 및 사용하는 대신 이의를 얻는 데이터 요청에서 직접(또는 사용이 이미 하나에 의해 제공됩 FOSUserBundle)
- 해야 합 추가 유효성 검사 메타데이터의 사용자 등과 유효성을 검사를 사용하는 유효성 검사(서비스의 사용자 검사-맵핑을 이미 제공 FOSUserBundle)
- 가 JsonResponse 를 사용할 수 있는 클래스
- HTTP 상태코드 상수에서 요청하는 클래스를 사용할 수 있는
다만 다음과 같은 명령을 사용합니다.
use Symfony\Component\HttpFoundation\JsonResponse;
return new JsonResponse($data, JsonResponse::HTTP_OK); // 200