Magento2 REST API 오류 '클래스가 없습니다'


12

Alan의 블로그 ( http://alankent.me/2015/07/24/creating-a-new-rest-web-service-in-magento-2/)를 기반으로 테스트 Magento 2.0.2 REST 웹 서비스를 만들었습니다.

Postman을 사용하여 사용자 정의 웹 서비스를 호출하고 다음 오류가 발생합니다.

"message": "Class  does not exist",
  "code": -1,
  "trace": "#0 P:\\wwwroot\\Magento202_com_loc\\Web\\vendor\\magento\\framework\\Webapi\\ServiceInputProcessor.php(128): ReflectionClass->__construct('')\n#1 P:\\wwwroot\\Magento202_com_loc\\Web\\vendor\\magento\\framework\\Webapi\\ServiceInputProcessor.php(262): Magento\\Framework\\Webapi\\ServiceInputProcessor->_createFromArray(NULL, '30')\n#2 P:\\wwwroot\\Magento202_com_loc\\Web\\vendor\\magento\\framework\\Webapi\\ServiceInputProcessor.php(99): Magento\\Framework\\Webapi\\ServiceInputProcessor->convertValue('30', NULL)\n#3 P:\\wwwroot\\Magento202_com_loc\\Web\\vendor\\magento\\module-webapi\\Controller\\Rest.php(262): Magento\\Framework\\Webapi\\ServiceInputProcessor->process('Test\\\\Calculator...', 'add', Array)\n#4 P:\\wwwroot\\Magento202_com_loc\\Web\\vendor\\magento\\module-webapi\\Controller\\Rest.php(160): Magento\\Webapi\\Controller\\Rest->processApiRequest()\n#5 P:\\wwwroot\\Magento202_com_loc\\Web\\var\\generation\\Magento\\Webapi\\Controller\\Rest\\Interceptor.php(24): Magento\\Webapi\\Controller\\Rest->dispatch(Object(Magento\\Framework\\App\\Request\\Http))\n#6 P:\\wwwroot\\Magento202_com_loc\\Web\\vendor\\magento\\framework\\App\\Http.php(115): Magento\\Webapi\\Controller\\Rest\\Interceptor->dispatch(Object(Magento\\Framework\\App\\Request\\Http))\n#7 P:\\wwwroot\\Magento202_com_loc\\Web\\vendor\\magento\\framework\\App\\Bootstrap.php(258): Magento\\Framework\\App\\Http->launch()\n#8 P:\\wwwroot\\Magento202_com_loc\\Web\\index.php(39): Magento\\Framework\\App\\Bootstrap->run(Object(Magento\\Framework\\App\\Http))\n#9 {main}"

Magento 기본 REST 웹 서비스를 성공적으로 호출 할 수 있습니다.

app / code / Test / Calculator / registration.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Test_Calculator',
__DIR__
);

app / code / Test / Calculator / etc / module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Test_Calculator" setup_version="1.0.0"/>
</config>

앱 / 코드 / 테스트 / 계산기 /etc/webapi.xml

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">

    <route url="/V1/calculator/add/:num1/:num2" method="GET">
        <service class="Test\Calculator\Api\CalculatorInterface" method="add"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
    </route>
</routes>

앱 / 코드 / 테스트 / 계산기 /etc/di.xml

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Test\Calculator\Api\CalculatorInterface" type="Test\Calculator\Model\Calculator" />
</config>

앱 / 코드 / 테스트 / 계산기 /Api/CalculatorInterface.php

<?php

namespace Test\Calculator\Api;

interface CalculatorInterface
{
    public function add($num1, $num2);
}

앱 / 코드 / 테스트 / 계산기 / 모델 /Calculator.php

<?php

namespace Test\Calculator\Model;

use Test\Calculator\Api\CalculatorInterface;

class Calculator implements CalculatorInterface
{
    public function add($num1, $num2) {
        return $num1 + $num2;
    }
}

오류를 반환하는 REST URL :

http://local.magento202.com:81/index.php/rest/V1/calculator/add/30/70

답변:


27

http://devdocs.magento.com/guides/v2.0/coding-standards/docblock-standard-general.html에 설명 된대로 app / code / Test / Calculator / Api / CalculatorInterface.php에 DocBlock이 필요합니다.

<?php

namespace Test\Calculator\Api;

interface CalculatorInterface
{
    /**
     * Add two numbers.
     *
     * @param int $num1
     * @param int $num2
     * @return int
     */
    public function add($num1, $num2);
}

1
"@param"대신 @params를 사용했기 때문에 동일한 오류가 발생했습니다. Magento 2는 코드 표준이 너무 엄격합니다 : P
Altaf Hussain

반환 json 배열을 원한다면 반환 값으로 무엇을 작성해야합니까
Bhupendra Jadeja

[at] 복귀 배열 @Bhupendra Jadeja
Ying Style

@AltafHussain 2 년이 지났다는 것을 알고 있지만 코딩 표준과는 아무런 관련이 없으며, 리플렉션을 사용하여 유효성 검사를 수행하므로 "@param"을 찾을 수 없습니다. 그것은 당신이 $ A를 설정처럼 나중에 $ B로 사용하도록하려는하지만 PHP는 기준이 너무 엄격
DarkMukke

당신은 선생님입니다. 감사합니다. 나는 그것이 중요하다고 생각하지 않았지만 내 문제를 해결했다.
seanbreeden

4

제 경우 문제는 인터페이스에서 "사용"클래스를 사용했다는 것입니다. Magento DocBlockReflection이이를 처리 할 수없고 전체 네임 스페이스가없는 인터페이스를 검색했습니다. 예를 들어 다음 코드에서는

use My\Namespace\ExampleObjectInterface
interface ExampleObjectRepositoryInterface
{
/**
 * xyz
 * @param int $id
 * @return ExampleObjectInterface
 * @throws \Magento\Framework\Exception\NoSuchEntityException
 * @throws \Magento\Framework\Exception\LocalizedException
 */
public function getById($id);
}

"사용"클래스를 제거해야했습니다.

interface ExampleObjectRepositoryInterface
{
/**
 * xyz
 * @param int $id
 * @return \My\Namespace\ExampleObjectInterface
 * @throws \Magento\Framework\Exception\NoSuchEntityException
 * @throws \Magento\Framework\Exception\LocalizedException
 */
public function getById($id);
}

세상에, 당신은 내 생명을 구했습니다. 나는 이것을 몇 시간 동안 디버깅했다. magento 프레임 워크가 사용하기 어려운 이유 :(
Alex

1

아래 명령이 성공적으로 실행되었는지 확인하십시오. API 호출을 중단하거나 누르지 마십시오. 실행 후 문제가 해결됩니다. 나를 위해 일했다.

php bin/magento setup:di:compile
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.