Installation
Add the bundle to your composer.json:
composer require campusdomar/pmk2-import-bundle
Enable it in config/bundles.php:
CampusDomar\PuMuKITImportBundle\PuMuKITImportBundle::class => ['all' => true],
First Use Case: Importing a PuMuKIT XML File
series_export.xml) in a dedicated directory (e.g., public/uploads/imports/).config/packages/campusdomar_pumukit_import.yaml:
campusdomar_pumukit_import:
import_dir: '%kernel.project_dir%/public/uploads/imports/'
allowed_channels: ['channel1', 'channel2'] # Optional: Restrict to specific channels
php bin/console campusdomar:pumukit:import series_export.xml
Resources/doc/InstallationGuide.md: Prerequisites (PuMuKIT2 setup, database compatibility).Resources/doc/ImportExecutionGuide.md: Command-line flags and post-import steps.src/Command/ImportCommand.php: Core logic for parsing XML and mapping to PuMuKIT entities.Pre-Import Validation
--validate flag to check XML structure before full import:
php bin/console campusdomar:pumukit:import series_export.xml --validate
var/log/import_validation.log (configure in config/packages/campusdomar_pumukit_import.yaml).Chunked Imports for Large Files
<series> nodes) and import sequentially:
php bin/console campusdomar:pumukit:import chunk1.xml
php bin/console campusdomar:pumukit:import chunk2.xml
--dry-run to preview changes without committing:
php bin/console campusdomar:pumukit:import series_export.xml --dry-run
Post-Import Actions
campusdomar:pumukit:update-metadata command for incremental updates:
php bin/console campusdomar:pumukit:update-metadata --file=updated_series.xml
allowed_channels in config or use the campusdomar:pumukit:publish command:
php bin/console campusdomar:pumukit:publish --series-id=123 --channel=channel1
Event Listeners: Extend functionality by subscribing to PuMuKITImportEvents (e.g., ImportPreProcessEvent):
// src/EventListener/CustomImportListener.php
namespace App\EventListener;
use CampusDomar\PuMuKITImportBundle\Event\ImportPreProcessEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CustomImportListener implements EventSubscriberInterface {
public static function getSubscribedEvents() {
return [
ImportPreProcessEvent::class => 'onImportPreProcess',
];
}
public function onImportPreProcess(ImportPreProcessEvent $event) {
$xmlData = $event->getXmlData();
// Modify $xmlData before parsing (e.g., add custom attributes)
}
}
Custom Mappers: Override default XML-to-entity mapping in config/packages/campusdomar_pumukit_import.yaml:
campusdomar_pumukit_import:
custom_mappers:
series: App\Mapper\CustomSeriesMapper
Implement CampusDomar\PuMuKITImportBundle\Mapper\MapperInterface.
API Triggers: Automate imports via HTTP requests by exposing a controller:
// src/Controller/ImportController.php
use CampusDomar\PuMuKITImportBundle\Command\ImportCommand;
use Symfony\Component\HttpFoundation\Request;
class ImportController {
public function import(Request $request, ImportCommand $command) {
$file = $request->files->get('xml_file');
$command->run(new ArrayInput(['file' => $file->getPathname()]), new NullOutput());
return new JsonResponse(['status' => 'import_started']);
}
}
XML Schema Mismatches
<publication_date>).--strict flag to fail on unknown nodes or patch the XML with defaults:
<series>
<publication_date>2023-01-01</publication_date> <!-- Add missing fields -->
</series>
Duplicate Entities
series_id).--skip-existing to bypass updates for existing records or implement a custom DuplicateHandler:
campusdomar_pumukit_import:
duplicate_handler: App\Handler\MergeDuplicateHandler
Database Transactions
campusdomar_pumukit_import:
transaction_chunk_size: 50 # Commit every 50 entities
Channel Restrictions
allowed_channels is misconfigured.channel table exactly (case-sensitive).config/packages/monolog.yaml:
handlers:
import:
type: stream
path: var/log/import.log
level: debug # Set to 'debug' for verbose output
--verbose or --debug flags:
php bin/console campusdomar:pumukit:import series.xml --debug
config/packages/dev/doctrine.yaml:
doctrine:
dbal:
profiling: true
Custom Fields
Series entity to support additional PuMuKIT v2.1 fields (e.g., custom_metadata):
// src/Entity/SeriesExtension.php
use Doctrine\ORM\Mapping as ORM;
class SeriesExtension {
/**
* @ORM\Column(type="json", nullable=true)
*/
private $customMetadata;
}
public function mapSeries(array $xmlSeries) {
$series = new Series();
$series->setCustomMetadata($xmlSeries['custom_field'] ?? null);
return $series;
}
Pre/Post-Import Hooks
CampusDomar\PuMuKITImportBundle\Event\ImportEventSubscriber to run logic before/after import:
public function onImportPostProcess(ImportPostProcessEvent $event) {
$importedIds = $event->getImportedIds();
// Send notification or update external systems
}
Batch Processing
# config/packages/messenger.yaml
framework:
messenger:
transports:
import: '%env(MESSENGER_TRANSPORT_DSN)%'
routing:
'CampusDomar\PuMuKITImportBundle\Message\ImportSeriesMessage': import
$bus->dispatch(new ImportSeriesMessage($xmlData, $chunkIndex));
import_dir to avoid issues with Symfony’s kernel.project_dir.php -d memory_limit=1G bin/console campusdomar:pumukit:import large_file.xml
publication_date in XML matches the server’s timezone (configure in .env):
APP_TIMEZONE=UTC
How can I help you explore Laravel packages today?