سؤال

أحاول استدعاء طريقة واجهة برمجة التطبيقات (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 لإنشاء مستخدم، فإنها تعمل بشكل مثالي.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;
}

نحن نحاول فقط الاتصال بطريقة 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);

يجب عليك إعادة هيكلة التعليمات البرمجية الخاصة بك بشكل كبير على الرغم من ...العمل هو طريق سمين جدا.

نصائح:

يبدو أنك جديد تمامًا على Symfony - فإليك بعض النصائح الأخرى:

  • يجب عليك إنشاء نوع نموذج تسجيل دخول واستخدامه بدلاً من الحصول على البيانات من الطلب مباشرةً (أو استخدام النموذج الذي توفره FOSUserBundle بالفعل)
  • يجب عليك إضافة بيانات تعريف التحقق من الصحة إلى فئة المستخدم الخاصة بك والتحقق من صحتها باستخدام خدمة التحقق من الصحة (يتم توفير تعيينات التحقق من صحة المستخدم بالفعل بواسطة FOSUserBundle )
  • هناك JsonResponse الطبقة التي يمكنك استخدامها
  • رموز حالة HTTP هي ثوابت في فئة الطلب التي يمكنك استخدامها

فقط استخدم ما يلي:

use Symfony\Component\HttpFoundation\JsonResponse;

return new JsonResponse($data, JsonResponse::HTTP_OK); // 200
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top