JMSSerializer独立 - 译注不存在,或者不能被自动装载

问题描述 投票:35回答:6

我试图用JMSSerializer作为独立的库映射JSON响应从API到我的模型类和正在运行了一些问题。

执行中的异常下面的代码的结果:

<?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.

我已经安装了通过作曲家项目的下列内容库

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

有没有什么明显的我失踪,因为我不使用的整个学说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'
);
?>
php jmsserializerbundle
6个回答
70
投票

很肯定这使静音自动加载比注册自己的命名空间方便多了。

AnnotationRegistry::registerLoader('class_exists');

40
投票

我遇到了同样的问题,发现你的问题通过谷歌。不幸的是,你还没有收到任何答案,所以我只好在自己掏。 :P

问题是,理论注解,这JMSSerializer注解使用,does NOT use normal PHP autoloading

这些注释是如何装?从看代码,你可以猜测,ORM映射,断言验证和完全合格的注释可以只使用PHP定义自动加载机加载。这种情况并非如此但是:用于错误处理的原因,存在着阶级每次检查里面的AnnotationReader设置class_exists的第二个参数$自动加载($名称,$自动加载)为false。为了完美地工作AnnotationReader需要自动加载机无声许多自动加载磁带机都没有。静音自动加载不是PSR-0规范自动加载的一部分。

这意味着你必须注册注释文件(S)自己:

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

我希望这可以让你更进了一步。 :)


4
投票

@SirArturio有正确回答这个自动加载拼图,我只是想响应@messified或其他人努力得到这个工作增添了一抹更加清晰。正如他雄辩地说明,在作曲家自动PSR-0处理器,或SPL是不会削减它,因为它们使用学说的自动装填装载这些注释。

因此,这里是小完整的例子。当你创建你的JMS串行目标开始系列化是注释命名空间添加到学说的自动加载机的好时机。为了清楚起见,我假设没有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;
}

这应该削减它,自动加载使用原则,而不是作曲家的正确注释文件。


3
投票

检查注释的资本。从Windows开发环境到这是在我的注释的情况下,一个错字引起了Ubuntu的服务器部署时,我也有类似的问题。的Windows文件是区分大小写的,因此在那里工作,但无法在Linux上。


0
投票

如果您使用Composer,您可以通过指定需要的路径得到装载机:

$loader = require(__DIR__ . '/../vendor/autoload.php');
AnnotationRegistry::registerLoader(array($loader, 'loadClass'));

-3
投票

下面是解

1.go到PHP目录,然后安装PHP作曲家作曲,setup.php 2.转到例如项目SDK目录

CD /应用/ XAMPP / xamppfiles / htdocs中/ streetreturn / adn_sdk-PHP-主

更新作曲家安装依赖PHP /Users/zakir/composer.phar更新

*注:/Users/zakir/composer.phar将当位于第1步中安装作曲家

© www.soinside.com 2019 - 2024. All rights reserved.