Атрибут Ignore
Атрибут Ignore вешается на свойство или метод класса и указывает
сериализатору пропустить его при нормализации и денормализации.
Это удобно, когда нужно скрыть конфиденциальные данные или
временные поля, которые не должны попадать в итоговый массив.
Атрибут не принимает обязательных параметров.
Синтаксис
#[Ignore]
Пример
Давайте создадим сущность User с полем password,
которое мы хотим исключить из сериализации:
<?php
namespace AppEntity;
use SymfonyComponentSerializerAnnotationIgnore;
class User
{
public string $name;
#[Ignore]
public string $password;
public function __construct(string $name, string $password)
{
$this->name = $name;
$this->password = $password;
}
}
?>
Теперь создадим контроллер, который сериализует объект
User в JSON:
<?php
namespace AppController;
use AppEntityUser;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSerializerSerializerInterface;
class UserController extends AbstractController
{
public function index(SerializerInterface $serializer): Response
{
$user = new User('abcde', 'secret');
$json = $serializer->serialize($user, 'json');
return new Response($json);
}
}
?>
Результат выполнения кода:
{"name":"abcde"}
Как видите, поле password не попало в итоговый JSON,
несмотря на то, что оно было заполнено значением 'secret'.
Пример
Атрибут Ignore можно вешать и на методы.
Давайте исключим метод getFullInfo из сериализации:
<?php
namespace AppEntity;
use SymfonyComponentSerializerAnnotationIgnore;
class Article
{
public string $title;
public string $text;
public function __construct(string $title, string $text)
{
$this->title = $title;
$this->text = $text;
}
#[Ignore]
public function getFullInfo(): string
{
return $this->title . ': ' . $this->text;
}
}
?>
Теперь сериализуем объект Article:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSerializerSerializerInterface;
class ArticleController extends AbstractController
{
public function index(SerializerInterface $serializer): Response
{
$article = new Article('article', 'hello');
$json = $serializer->serialize($article, 'json');
return new Response($json);
}
}
?>
Результат выполнения кода:
{"title":"article","text":"hello"}
Метод getFullInfo не был вызван при сериализации,
поэтому в JSON попали только свойства title и text.
Пример
Атрибут Ignore работает и при десериализации.
Если в JSON есть поле, помеченное этим атрибутом,
оно будет проигнорировано. Рассмотрим пример:
<?php
namespace AppController;
use AppEntityUser;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSerializerSerializerInterface;
class UserController extends AbstractController
{
public function index(SerializerInterface $serializer): Response
{
$json = '{"name":"abcde","password":"secret"}';
$user = $serializer->deserialize($json, User::class, 'json');
return new Response($user->password);
}
}
?>
Результат выполнения кода:
""
Поле password было проигнорировано при десериализации,
поэтому оно осталось пустым, несмотря на то,
что в JSON было передано значение 'secret'.
Смотрите также
-
класс
Serializer,
который выполняет сериализацию и десериализацию -
метод
serialize,
который превращает объект в строку формата -
метод
deserialize,
который создаёт объект из строки формата -
атрибут
Groups,
который задаёт группы сериализации