campusdomar/pumukit-import-bundle
Installation Add the bundle to your Symfony project via Composer:
composer require campusdomar/pumukit-import-bundle
Enable the bundle in config/bundles.php:
return [
// ...
CampusDomar\PumukitImportBundle\PumukitImportBundle::class => ['all' => true],
];
Configuration
Follow the Installation Guide to configure config/packages/pumukit_import.yaml with your PuMuKIT database credentials and import settings.
First Use Case: Importing a Series
Export a series from PuMuKIT v1.7 in XML format (using PuMuKIT1-data-export).
Place the XML file in a dedicated directory (e.g., var/imports/).
Run the import command:
php bin/console pumukit:import:series /path/to/your/file.xml
Batch Processing Use the bundle to import multiple XML files sequentially:
php bin/console pumukit:import:series file1.xml file2.xml
For large datasets, split XML files into smaller chunks to avoid memory issues.
Integration with Custom Logic
Extend the bundle’s importer by creating a custom service that implements CampusDomar\PumukitImportBundle\Service\ImporterInterface:
namespace App\Service;
use CampusDomar\PumukitImportBundle\Service\ImporterInterface;
use CampusDomar\PumukitImportBundle\Entity\Series;
class CustomSeriesImporter implements ImporterInterface
{
public function import(Series $series): void
{
// Custom logic (e.g., validate, transform, or enrich data)
}
}
Register the service in services.yaml and reference it in the bundle’s configuration.
Scheduled Imports
Use Symfony’s scheduler (e.g., with cron or a task runner like spatie/symfony-cron) to automate imports:
# config/packages/schedule.yaml
schedule:
import_series:
command: 'pumukit:import:series /path/to/file.xml'
cron: '0 3 * * *' # Run daily at 3 AM
series, episodes, and publication_channels). Refer to PuMuKIT’s schema docs.config/packages/monolog.yaml to track import progress and errors:
handlers:
pumukit_import:
type: stream
path: var/log/pumukit_import.log
level: debug
xmllint or PHP’s DOMDocument::schemaValidate().XML Parsing Errors
xmllint --schema path/to/pumukit_schema.xsd your_file.xml
Or use PHP’s SimpleXMLElement to catch parsing errors:
$xml = simplexml_load_file($filePath);
if ($xml === false) {
throw new \RuntimeException("Invalid XML file");
}
Duplicate Data
unique_identifier field in the XML (if available) to skip existing records. Extend the importer to check for duplicates:
$existingSeries = $entityManager->getRepository(Series::class)
->findOneBy(['uniqueIdentifier' => $series->getUniqueIdentifier()]);
if ($existingSeries) {
$this->logger->info('Skipping duplicate series', ['id' => $series->getUniqueIdentifier()]);
return;
}
Missing Publication Channels
publication_channel_id) don’t exist in the database.Memory Limits
memory_limit).php.ini or process files in chunks using SimpleXMLIterator:
$xml = simplexml_load_file($filePath);
foreach ($xml->series as $series) {
// Process one series at a time
}
php bin/console pumukit:import:series file.xml --verbose
prePersist and preUpdate events to inspect entity changes:
# config/services.yaml
App\EventListener\SeriesImportListener:
tags:
- { name: doctrine.event_listener, event: prePersist }
// src/EventListener/SeriesImportListener.php
public function prePersist(LifecycleEventArgs $args): void
{
$entity = $args->getObject();
if ($entity instanceof Series) {
$this->logger->debug('Importing series', ['data' => $entity->toArray()]);
}
}
Custom Mappers Override the default XML-to-entity mapping by creating a custom mapper:
namespace App\Mapper;
use CampusDomar\PumukitImportBundle\Mapper\SeriesMapperInterface;
use CampusDomar\PumukitImportBundle\Entity\Series;
class CustomSeriesMapper implements SeriesMapperInterface
{
public function map(array $xmlData): Series
{
$series = new Series();
// Custom mapping logic
return $series;
}
}
Register it in services.yaml and reference it in the bundle’s configuration.
Post-Import Actions Trigger actions after import (e.g., generate thumbnails, send notifications):
# config/packages/pumukit_import.yaml
pumukit_import:
post_import_actions:
- App\Service\ThumbnailGenerator
- App\Service\NotificationSender
Custom Validation Add validation rules to the importer:
use Symfony\Component\Validator\Constraints as Assert;
$series->addConstraint(new Assert\Length([
'min' => 3,
'minMessage' => 'Title must be at least 3 characters long',
]));
# config/packages/pumukit_import.yaml
pumukit_import:
use_transactions: false
# .env
PUMUKIT_DB_USER=your_user
PUMUKIT_DB_PASSWORD=your_password
Then reference them in pumukit_import.yaml:
pumukit_import:
db:
user: '%env(PUMUKIT_DB_USER)%'
password: '%env(PUMUKIT_DB_PASSWORD)%'
How can I help you explore Laravel packages today?