38

JMSSerializerをスタンドアロンライブラリとして使用して、APIからのJSON応答をモデルクラスにマップしようとしていますが、いくつかの問題が発生しています。

次のコードを実行すると、例外が発生します。

<?php
require dirname(__DIR__) . '/vendor/autoload.php';

use JMS\Serializer\Annotation AS JMS;

class Trii {
    /**
     * User ID for this session
     * @JMS\SerializedName("userID")
     * @JMS\Annotation(getter="getUserId")
     * @JMS\Type("string")
     * @var string
     */
    private $userId;

    public function getUserId() {
        return $this->userId;
    }

    public function setUserId($userId) {
        $this->userId = $userId;
    }
}

$serializer = \JMS\Serializer\SerializerBuilder::create()->setDebug(true)->build();
$object = $serializer->deserialize('{"userID":"Trii"}', 'Trii', 'json');
var_dump($object);
?>

これが例外です

Doctrine\Common\Annotations\AnnotationException: [Semantical Error] The annotation "@JMS\Serializer\Annotation\SerializedName" in property Trii::$userId does not exist, or could not be auto-loaded.

私はcomposerを介してプロジェクト用に次のライブラリをインストールしています

{
    "require": {
        "jms/serializer": "1.0.*@dev"
    }
}

Doctrine 2ソリューション全体を使用していないので、私が見逃している明らかなものはありますか?

編集:私の最終的な解決策は、次の内容のブートストラップファイルを作成することでした:

<?php
// standard composer install vendor autoload magic
require dirname(__DIR__) . '/vendor/autoload.php';

// Bootstrap the JMS custom annotations for Object to Json mapping
\Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace(
    'JMS\Serializer\Annotation',
    dirname(__DIR__).'/vendor/jms/serializer/src'
);
?>
4

6 に答える 6

73

これにより、名前空間を自分で登録するよりもはるかに便利なサイレント自動ロードが有効になることは間違いありません。

AnnotationRegistry::registerLoader('class_exists');
于 2014-02-04T09:39:09.020 に答える
40

私は同じ問題に遭遇し、Googleを通じてあなたの質問を見つけました。残念ながら、まだ回答がないので、自分で掘り下げなければなりませんでした。:P

重要なのは、JMSSerializerAnnotationsが使用するDoctrineAnnotationsは、通常のPHP自動読み込みを使用しないということです。

これらの注釈はどのようにロードされますか?コードを見ると、ORMマッピング、Assert Validation、および完全修飾アノテーションは、定義されたPHPオートローダーを使用してロードできることが推測できます。ただし、これは当てはまりません。エラー処理の理由から、AnnotationReader内のクラスの存在をチェックするたびに、class_exists($ name、$ autoload)の2番目のパラメーター$autoloadがfalseに設定されます。AnnotationReaderを問題なく動作させるには、多くのオートローダーにはないサイレントオートローダーが必要です。サイレントオートローディングは、オートローディングのPSR-0仕様の一部ではありません。

これは、注釈ファイルを自分で登録する必要があることを意味します。

AnnotationRegistry::registerFile(
   <PROJECT ROOT> . 
   "/vendor/jms/serializer/src/JMS/Serializer/Annotation/SerializedName.php");

...または名前空間全体(推奨される方法):

AnnotationRegistry::registerAutoloadNamespace(
    'JMS\Serializer\Annotation', 
    <PROJECT ROOT> . "/vendor/jms/serializer/src");

のパスに注意してくださいregisterAutoloadNamespace。私は最初に、同じ方法で注釈へのパス全体を登録しようとしましたregisterFile

<PROJECT ROOT> . "/vendor/jms/serializer/src/JMS/Serializer/Annotation 

しかし、それは惨めに失敗しました。:D

これでさらに一歩進んでいただければ幸いです。:)

于 2013-02-01T12:37:23.563 に答える
4

@SirArturioは、この自動読み込みパズルに対する正解を持っています。@ messifiedや、これを機能させるのに苦労している他の人に対応して、もう少し明確にしたかっただけです。彼が雄弁に説明したように、composerの自動PSR-0ハンドラー、またはSPLは、Doctrineの自動ロードを使用するため、これらの注釈をロードするためにそれをカットしません。

だからここに小さな完全な例があります。シリアル化を開始するためにJMSSerializerオブジェクトを作成するときはいつでも、アノテーション名前空間をdoctrineのオートローダーに追加する良い機会です。わかりやすくするために、IoCがなく、完全に修飾された名前空間(ヒントのヒント、依存性注入を使用)を想定しています。

<?php
Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace(
'JMS\Serializer\Annotation', 
$your_app_basepath . "/vendor/jms/serializer/src");


$serializer = JMS\Serializer\SerializerBuilder::create()->build();
$json_output = $serializer->serialize('MyProject\MyClass', 'json');

次に、MyProject \ MyClassで:

<?php
use JMS\Serializer\Annotation as JMS;

class MyClass{

    /** @JMS\Exclude */
    private $something_secret;
}

そして、それはそれをカットし、composerの代わりにdoctrineを使用して適切な注釈ファイルを自動ロードする必要があります。

于 2013-11-15T15:53:17.173 に答える
3

注釈の大文字と小文字を確認してください。Windows開発環境からUbuntuサーバーにデプロイするときにも同様の問題が発生しました。これは、アノテーションの場合のタイプミスが原因でした。Windowsファイルでは大文字と小文字が区別されないため、そこでは機能しますが、Linuxでは失敗します。

于 2013-06-26T14:14:56.187 に答える
0

Composerを使用している場合は、requireでパスを指定することでローダーを取得できます。

$loader = require(__DIR__ . '/../vendor/autoload.php');
AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
于 2019-02-08T13:22:41.557 に答える
-3

これが解決策です

1. phpディレクトリに移動し、composerphpcomposer-setup.phpをインストールします。2。プロジェクトのsdkディレクトリに移動します。

cd / Applications / XAMPP / xamppfiles / htdocs / streetreturn / adn_sdk-php-master

依存関係をインストールするようにcomposerを更新しますphp/Users/zakir/composer.pharupdate

*注:/Users/zakir/composer.pharは、手順1でcomposerをインストールするときに配置されます。

于 2017-03-02T18:05:30.633 に答える