Symfony 2-FOSRestBundle-从另一个控制器调用api方法



我试图调用API的一个方法,但我得到了这个异常:

FatalErrorException: Error: Call to undefined method 
ProjectBundleApiBundleControllerUserController::userCreate() in
Symfony/src/Project/Bundle/UserBundle/Controller/UserController.php line 56

我尝试调用API的方法来创建用户,这样就不会重复相同的代码两次。API将被移动设备使用。在浏览器上,当用户尝试注册时,它会调用一个将调用API创建用户的路由。这就是我要做的…

如果我直接调用createuser的URLapi,它可以完美地工作。app_dev.php/api/user/create但是当我在我的控制器中调用这个方法时,就像这里一样:

public function registerAction()
{
$apiUserController = new MoodressBundleApiBundleControllerUserController;
$answer = $apiUserController->userCreate();
return $this->redirect($this->generateUrl('moodress_home'));
} 

他在UserController中找不到我的userCreate方法。。。

这是我的用户控制器:

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 MoodressBundleApiBundleControllerUserController();

您至少需要为$this->get('...')调用注入容器才能工作:

$controller->setContainer($this->container);

不过,您应该对代码进行大量重构。。。动作太胖了。

提示:

由于你似乎对symfony还很陌生,这里有一些其他提示:

  • 您应该创建一个登录表单类型并使用它,而不是直接从请求中获取数据(或者使用FOSUserBundle已经提供的数据)
  • 您应该将验证元数据添加到用户类中,并使用验证器服务对其进行验证(FOSUserBundle已经提供了用户验证映射)
  • 有一个JsonResponse类可以使用
  • HTTP状态代码是请求类中可以使用的常量

只需使用以下内容:

use SymfonyComponentHttpFoundationJsonResponse;
return new JsonResponse($data, JsonResponse::HTTP_OK); // 200

相关内容

  • 没有找到相关文章

最新更新