Взаимодействие с внешними системами
Когда требуется взаимодействие с другими системами, основными компонентами для обмена данными выступают объекты данных (Data Objects). Объекты Pimcore можно программно создавать, заполнять и получать списками, что позволяет реализовать пакетный импорт и экспорт с минимальным объёмом кода.
Рекомендуемый способ взаимодействия с внешними системами — использование PHP‑API Pimcore и создание слоя интеграции своим PHP‑кодом. Такой слой интеграции может быть реализован внутри плагина Pimcore, в виде библиотечного компонента, в виде собственного веб‑сервиса, в виде CLI‑команды или просто в виде простого CLI‑скрипта — у вас полная гибкость выбора.
В примерах ниже для простоты используются простые CLI‑скрипты, хотя рекомендуется использовать Symfony CLI‑Commands (Pimcore‑команды).
Импорт
Ниже приведён пример создания нового объекта класса myclass.
Поместите следующий код в файл, например /bin/example.php (или в любой другой PHP‑файл, выполняемый в контексте приложения):
<?php
namespace App\Command;
use Pimcore\Console\AbstractCommand;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Pimcore\Model\DataObject;
#[AsCommand(
name: 'app:awesome',
description: 'Awesome command'
)]
class AwesomeCommand extends AbstractCommand
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
// создать единственный объект
$object = new DataObject\Myclass();
$object->setKey(1);
$object->setParentId(1);
$object->setPublished(true);
$object->setMyattribute("This is a test");
$object->save();
// или создать множество объектов
for ($i = 0; $i < 60; $i++) {
$o = new DataObject\News();
$o->setKey(uniqid() . "-" . $i);
$o->setParentId(1);
$o->setPublished(true);
$o->save();
$output->writeln("Created object " . $o->getFullPath() . "\n");
}
}
}
Таким образом, несколькими строками кода можно реализовать скрипты‑импортеры для заполнения объектов данными. Обратите внимание на Pimcore\Console, чтобы интегрировать свои CLI‑скрипты в консоль Pimcore.
Экспорт
Экспорт объектов данных может быть осуществлен программно аналогично импорту с помощью листингов объектов и написания всего нескольких строк кода.
$file = fopen("export.csv","w");
$entries = new DataObject\Myclassname\Listing();
$entries->setCondition("name LIKE ?", "%bernie%");
foreach($entries as $entry) {
fputcsv($file, [
'id' => $entry->getId(),
'name' => $entry->getName()
]);
}
fclose($file);
Для простого экспорта в CSV интерфейс админки Pimcore уже предоставляет готовую функциональность CSV‑экспорта.
Проблемы с памятью
Если вы обрабатываете/создаёте очень большое количество объектов, рекомендуется вызывать сборщик мусора Pimcore (garbage collector) через несколько циклов, чтобы избежать проблем с памятью
// просто вызовите этот статический метод
\Pimcore::collectGarbage();
Или можно использовать RuntimeCache::disable() перед итерацией большого количества объектов, чтобы избежать чрезмерного использования памяти.
ВНИМАНИЕ: это очистит весь внутренний реестр!
Чтобы избежать этого, вы можете передать массив с ключами (индексами), которые должны оставаться в реестре, например:
\Pimcore::collectGarbage(["myImportantKey", "myConfig"]);
// Вы также можете добавлять элементы в статический список глобально защищенных ключей, передавая их в
$longRunningHelper = \Pimcore::getContainer()->get(\Pimcore\Helper\LongRunningHelper::class);
$longRunningHelper->addPimcoreRuntimeCacheProtectedItems(["myVeryImportantKey", "mySuperImportKey", "..."]);
// Этот список сохраняется до тех пор, пока существует процесс. Вы можете снова удалить защищенные ключи, вызвав
$longRunningHelper->removePimcoreRuntimeCacheProtectedItems(["myVeryImportantKey", "mySuperImportKey", "..."]);
Если вам нужно передать только один ключ, вместо массива можно передать строку.
Временные файлы
Временные файлы, создаваемые в процессе обработки, обычно удаляются по завершении текущего процесса. В некоторых случаях это может быть проблемой, если внутри процесса создаётся тысячи временных файлов. Если вы хотите очистить временные файлы до завершения скрипта, вызовите
\Pimcore::deleteTemporaryFiles();
Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.