Перейти к основному содержимому
Версия: 1.x

← Предыдущая · Назад к README · Следующая →

Директивы

Форматы: XML

Зарезервированные директивы

Директивы доступны только при генерации фидов в формате XML.

@attributes​

Обозначает массив атрибутов.

Чтобы добавить атрибуты к узлу, используйте ключ @attributes:

namespace App\Feeds;

use App\Feeds\Info\AttributesDirectiveFeedInfo;
use App\Feeds\Items\AttributesDirectiveFeedItem;
use App\Models\User;
use DragonCode\LaravelFeed\Feeds\Feed;
use DragonCode\LaravelFeed\Feeds\Info\FeedInfo;
use DragonCode\LaravelFeed\Feeds\Items\FeedItem;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;

class AttributesDirectiveFeed extends Feed
{
public function builder(): Builder
{
return User::query();
}

public function info(): FeedInfo
{
return new AttributesDirectiveFeedInfo;
}

public function item(Model $model): FeedItem
{
return new AttributesDirectiveFeedItem($model);
}
}
namespace App\Feeds\Info;

use DragonCode\LaravelFeed\Feeds\Info\FeedInfo;

use function fake;

class AttributesDirectiveFeedInfo extends FeedInfo
{
public function toArray(): array
{
return [
'company' => [
'@attributes' => ['since' => fake()->year],
],

'url' => config('app.url'),
];
}
}
namespace App\Feeds\Items;

use DragonCode\LaravelFeed\Feeds\Items\FeedItem;

class AttributesDirectiveFeedItem extends FeedItem
{
public function toArray(): array
{
return [
'name' => $this->model->name,

'contact' => [
'@attributes' => [
'email' => $this->model->email,
'phone' => '555-000-' . $this->model->id,
],
],
];
}
}

Этот код даст следующий результат:

<?xml version="1.0" encoding="UTF-8"?>
<attributes_directive>

<company since="1994"/>
<url>https://example.com</url>

<user>
<name>User 1</name>
<contact email="[email protected]" phone="555-000-1"/>
</user>
<user>
<name>User 2</name>
<contact email="[email protected]" phone="555-000-2"/>
</user>

</attributes_directive>

@value​

Обозначает значение, которое нужно использовать «как есть».

подсказка

Значение поля @value должно быть строкой.

Чтобы добавить значение к узлу, используйте ключ @value:

namespace App\Feeds\Items;

use DragonCode\LaravelFeed\Feeds\Items\FeedItem;

class ValueDirectiveFeedItem extends FeedItem
{
public function toArray(): array
{
return [
'name' => [
'@value' => $this->model->name,
],

'contact' => [
'@attributes' => ['type' => 'email'],
'@value' => $this->model->email,
],
];
}
}

Этот код даст следующий результат:

<?xml version="1.0" encoding="UTF-8"?>
<value_directive>

<user>
<name>User 1</name>
<contact type="email">[email protected]</contact>
</user>
<user>
<name>User 2</name>
<contact type="email">[email protected]</contact>
</user>

</value_directive>

@cdata​

Позволяет использовать XML-разметку без преобразования.

подсказка

Значение узла также можно обернуть в секцию CDATA. Это позволяет использовать зарезервированные символы.

Чтобы добавить CDATA к узлу, используйте ключ @cdata:

namespace App\Feeds\Items;

use DragonCode\LaravelFeed\Feeds\Items\FeedItem;

use function sprintf;

class CdataDirectiveFeedItem extends FeedItem
{
public function toArray(): array
{
return [
'name' => [
'@cdata' => sprintf('<h1>%s</h1>', $this->model->name),
],

'email' => $this->model->email,
];
}
}

Этот код даст следующий результат:

<?xml version="1.0" encoding="UTF-8"?>
<cdata_directive>

<user>
<name><![CDATA[<h1>User 1</h1>]]></name>
<email>[email protected]</email>
</user>
<user>
<name><![CDATA[<h1>User 2</h1>]]></name>
<email>[email protected]</email>
</user>

</cdata_directive>

@mixed​

Позволяет использовать XML-разметку непосредственно в структуре документа.

Чтобы вставить XML-фрагменты «как есть», используйте директиву @mixed:

namespace App\Feeds\Items;

use DragonCode\LaravelFeed\Feeds\Items\FeedItem;

class MixedDirectiveFeedItem extends FeedItem
{
public function toArray(): array
{
return [
'name' => $this->model->name,

'@mixed' => <<<XML
<some>
<first>Foo</first>
<second>{$this->model->email}</second>
</some>
XML,
];
}
}

Этот код даст следующий результат:

<?xml version="1.0" encoding="UTF-8"?>
<mixed_directive>

<user>
<name>User 1</name>
<some>
<first>Foo</first>
<second>[email protected]</second>
</some>
</user>
<user>
<name>User 2</name>
<some>
<first>Foo</first>
<second>[email protected]</second>
</some>
</user>

</mixed_directive>

@custom​

Описывает возможность перечислить массив элементов с одинаковыми ключами.

Иногда нужно разместить массив элементов с одинаковыми именами.

Для этого добавьте символ @ в начало имени ключа:

namespace App\Feeds\Items;

use DragonCode\LaravelFeed\Feeds\Items\FeedItem;

use function fake;

class ArrayDirectiveFeedItem extends FeedItem
{
public function toArray(): array
{
return [
'name' => $this->model->name,

'@avatar' => [
fake()->imageUrl(),
fake()->imageUrl(),
],

'@images' => [
[
'@attributes' => ['name' => fake()->words(asText: true)],
'@value' => fake()->imageUrl(),
],
[
'@attributes' => ['name' => fake()->words(asText: true)],
'@value' => fake()->imageUrl(),
],
],
];
}
}

Этот код даст следующий результат:

<?xml version="1.0" encoding="UTF-8"?>
<array_directive>

<user>
<name>User 1</name>
<avatar>https://via.placeholder.com/640x480.png/00ffff?text=aut</avatar>
<avatar>https://via.placeholder.com/640x480.png/0022dd?text=et</avatar>
<images name="doloremque distinctio facere">https://via.placeholder.com/640x480.png/0099dd?text=ea</images>
<images name="fuga odio expedita">https://via.placeholder.com/640x480.png/00cc77?text=sint</images>
</user>
<user>
<name>User 2</name>
<avatar>https://via.placeholder.com/640x480.png/00ff99?text=est</avatar>
<avatar>https://via.placeholder.com/640x480.png/003300?text=non</avatar>
<images name="distinctio et aliquam">https://via.placeholder.com/640x480.png/0099aa?text=accusantium</images>
<images name="consequatur soluta nemo">https://via.placeholder.com/640x480.png/0099cc?text=ab</images>
</user>

</array_directive>

Смотрите также​