akeneo/magento-connector-bundle
Akeneo Magento Connector Bundle integrates Akeneo PIM with Magento, enabling synchronization of products, categories, attributes, families, and related catalog data so information stays consistent across both platforms.
First thing to internalize: this is not a Laravel package. It is a Symfony bundle that must be installed inside an Akeneo PIM application and registered in that app's kernel. There is no service provider, no config file you publish with php artisan vendor:publish, no facade. Attempting composer require akeneo/magento-connector-bundle inside a Laravel composer.json will either fail dependency resolution (it pulls Akeneo pim-* components, BatchBundle, ConnectorBundle, Doctrine ORM, Symfony 2.x) or produce a package you can never load. Treat it as reference material and an integration endpoint, not a library your Laravel app consumes.
Where to look first, in order:
DependencyInjection/ and Resources/config/ — this is the wiring. Job definitions, step services, and parameters live here. Read the job YAML files first; they tell you what the connector actually does (reader → processor chain → writer) faster than any doc.Writer/ — the Magento API client surface. This is where payloads are assembled and where you would subclass if you needed custom behavior.Processor/ and Normalizer/ — attribute mapping, family handling, and configurable/variant logic. This is where 90% of real-world mapping problems surface.Minimal first use case (do this, not a full catalog):
AppKernel, clear cache, confirm the export profile type appears in the UI.akeneo:batch:job <job_code> and verify the product, its attributes, its category assignment, and its image land correctly in Magento.If you are a Laravel developer whose job is to orchestrate these exports from a Laravel app (which is the realistic scenario), your "getting started" is different: you do not install this bundle at all. You drive Akeneo from the outside — via akeneo:batch:job triggered through SSH, Akeneo's REST API, or scheduled exports that drop files for a Magento-side importer — and you study this repo's job/profile structure to understand the contract you are triggering.
Profile-as-configuration. The bundle's primary day-to-day surface is the export profile, not code. In practice you create or duplicate a profile per Magento store view, each with its own channel, locale, attribute mapping, and Magento credentials. Do not multiplex store views inside one profile — the mapping assumes a single target. Treat profiles as versioned configuration artifacts and keep their exported YAML in source control so a Laravel deployment pipeline can diff them.
The batch job is the unit of work. Everything runs as a standard Akeneo batch job (reader → processor(s) → writer), invoked with akeneo:batch:job. From a Laravel orchestration perspective, the useful pattern is to wrap invocation in a queued job that: runs the export via SSH or the Akeneo API, tails the batch status, captures the job execution log, and records a reconciliation row (source count vs. target count per family). Never fire-and-forget — the connector's failure modes are partial writes, so you need a follow-up verification step.
Fork-and-extend for custom mapping. When the default mapping does not fit, the correct pattern is to subclass the existing writer or implement Akeneo's WriterInterface/ProcessorInterface, register the new service in Resources/config/, and override the job's step definition via a compiler pass or job YAML override. This is standard Symfony DI — no Laravel service provider. If you must extend, keep the fork in a separate bundle so you can rebase against the upstream tag you pinned.
Attribute normalization belongs in the normalizer, not post-processing. Simple products flow through attribute-set normalizers reasonably well; configurable products need explicit handling of variant groups, axes, and option linkage. If you find yourself patching the Magento payload after the fact, you have chosen the wrong extension point — extend the normalizer that maps Akeneo attribute codes to Magento attribute codes instead. The mapping YAML is the seam; use it.
One profile per concern when catalogs grow. For large catalogs, partition exports by family or website view rather than scaling a single giant job. This is engineering work, not configuration toggling — but it is the pattern that keeps runtimes inside their window and makes partial failures recoverable per-partition.
Idempotent re-run is the workflow, not an edge case. Design every orchestration around the assumption that a job will be re-run: dedupe by SKU on the Magento side, treat "already exists" as a no-op where possible, and always run a post-export reconciliation report before marking the pipeline green.
Where this fits in a Laravel architecture. Realistic patterns, in preference order:
akeneo:batch:job runs, stores execution history, alerts on failure, and computes reconciliation metrics. Your app never imports the bundle.akeneo:batch:job gives you a job execution ID; the Akeneo batch status and execution log are your primary forensic tools. Tailing those logs from the Laravel orchestrator (rather than parsing Magento errors) is the fastest path to root-causing partial failures.WriterInterface/ProcessorInterface implementations, Resources/config/ job and service YAML, and the attribute-mapping YAML. If you extend anywhere else, you are probably fighting the framework.How can I help you explore Laravel packages today?