PimCore to platforma open source oparta na Symfony, która łączy w jednym narzędziu CMS, DAM (zarządzanie zasobami cyfrowymi) i PIM (zarządzanie informacją produktową). W przeciwieństwie do Akeneo, które jest dedykowanym PIMem, PimCore jest bardziej universalny – możesz zbudować w nim zarówno stronę korporacyjną, jak i katalog produktowy zasilający sklep Magento. Pokazuję architekturę i pierwsze kroki z perspektywy PHP developera.
Czym PimCore różni się od WordPressa i Magento?
WordPress to CMS zorientowany na treści edytorialne – posty, strony, media. Magento to platforma e-commerce z zarządzaniem produktami. PimCore leży między nimi i obok nich:
| Aspekt | WordPress | Magento 2 | PimCore |
|---|---|---|---|
| Główne zastosowanie | CMS / blog | E-commerce | CMS + PIM + DAM |
| Framework | własny | Laminas / własny | Symfony |
| Model danych | Posty + meta | EAV | Klasy obiektów (elastyczny) |
| API | REST (WP REST API) | REST + GraphQL | REST + GraphQL + Data Hub |
| Wersjonowanie treści | Rewizje | Ograniczone | Pełne wersjonowanie |
| DAM | Media Library (proste) | Media Gallery | Pełny DAM z metadanymi |
Instalacja przez Composer i DDEV
# Instalacja PimCore przez Composer (szkielet projektu)
composer create-project pimcore/skeleton pimcore-project
cd pimcore-project
# Konfiguracja DDEV
ddev config \
--project-type=php \
--project-name=pimcore-dev \
--php-version=8.0 \
--docroot=public
ddev start
# Instalacja PimCore
ddev exec vendor/bin/pimcore-install \
--admin-username=admin \
--admin-password=admin123 \
--mysql-host=db \
--mysql-username=db \
--mysql-password=db \
--mysql-database=db \
--no-interaction
Klasy obiektów – serce PimCore
W PimCore nie definiujesz produktów jako atrybutów EAV jak w Magento. Tworzysz klasy obiektów – elastyczne schematy danych które możesz projektować przez GUI admina lub przez kod. Każda klasa generuje własną tabelę w bazie i klasę PHP:
<?php
// Wygenerowana klasa PHP dla obiektu "Product"
// app/Models/Product.php - automatycznie generowana przez PimCore
namespace App\Models;
use Pimcore\Model\DataObject\Product;
// Pobierz produkt po ID
$product = Product::getById(42);
echo $product->getName(); // getter dla pola "name"
echo $product->getSku(); // getter dla pola "sku"
echo $product->getPrice(); // getter dla pola "price"
echo $product->getCategory(); // relacja do obiektu kategorii
// Pobierz kolekcję z filtrami
$listing = new Product\Listing();
$listing->setCondition('price > ?', [100]);
$listing->setOrderKey('name');
$listing->setOrder('ASC');
$listing->setLimit(20);
foreach ($listing as $product) {
echo $product->getName() . ' - ' . $product->getPrice() . PHP_EOL;
}
Data Hub – GraphQL API bez pisania kodu
PimCore Data Hub to jeden z jego największych atutów. Definiujesz schemat GraphQL przez panel admina – bez linii kodu PHP – i natychmiast masz API gotowe do konsumpcji przez Magento, Vue Storefront lub aplikację mobilną:
// Zapytanie GraphQL do PimCore Data Hub
query {
getProductListing(
filter: "{\"price\": {\"$gt\": 50}}"
sortBy: "name"
first: 10
) {
edges {
node {
id
name
sku
price
category {
... on object_Category {
name
path
}
}
images {
fullpath
mimetype
}
}
}
totalCount
}
}
Własne kontrolery – PimCore jako Symfony
Pod spodem PimCore to Symfony – możesz pisać własne kontrolery dokładnie tak jak w czystym Symfony:
<?php
declare(strict_types=1);
namespace App\Controller;
use App\Models\Product;
use Pimcore\Controller\FrontendController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class ProductApiController extends FrontendController
{
#[Route('/api/products', methods: ['GET'])]
public function listAction(Request $request): JsonResponse
{
$listing = new Product\Listing();
$listing->setLimit($request->query->getInt('limit', 20));
$listing->setOffset($request->query->getInt('offset', 0));
$category = $request->query->get('category');
if ($category) {
$listing->setCondition(
'category__id = ?',
[(int) $category]
);
}
$items = [];
foreach ($listing as $product) {
$items[] = [
'id' => $product->getId(),
'name' => $product->getName(),
'sku' => $product->getSku(),
'price' => $product->getPrice(),
];
}
return new JsonResponse([
'items' => $items,
'total' => $listing->getTotalCount(),
]);
}
}
Integracja PimCore z Magento 2
Typowy przepływ danych w projektach e-commerce z PimCore:
- PimCore jako źródło prawdy dla danych produktowych i zasobów cyfrowych
- Magento 2 jako silnik sprzedaży – ceny, stany magazynowe, zamówienia
- Import z PimCore do Magento przez REST API lub kolejkę wiadomości
- Zdjęcia z PimCore DAM trafiają do Magento przez bezpośrednie URL lub synchronizację
<?php
// Przykładowy skrypt synchronizacji - PimCore wysyła do Magento REST API
namespace App\EventListener;
use App\Models\Product;
use Pimcore\Event\Model\DataObjectEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ProductSyncListener implements EventSubscriberInterface
{
public function __construct(
private \GuzzleHttp\Client $magentoClient
) {}
public static function getSubscribedEvents(): array
{
return [
'pimcore.dataobject.postUpdate' => 'onProductUpdate',
];
}
public function onProductUpdate(DataObjectEvent $event): void
{
$object = $event->getObject();
if (!$object instanceof Product) {
return;
}
// Wyślij zaktualizowane dane do Magento REST API
$this->magentoClient->put('/rest/V1/products/' . $object->getSku(), [
'json' => [
'product' => [
'name' => $object->getName(),
'price' => $object->getPrice(),
'custom_attributes' => [
['attribute_code' => 'description', 'value' => $object->getDescription()],
],
],
],
]);
}
}
Kiedy wybrać PimCore zamiast Akeneo?
Akeneo to wyspecjalizowany PIM – doskonały gdy potrzebujesz wyłącznie zarządzania danymi produktowymi z rozbudowanym workflow i walidacją jakości. PimCore ma szersze zastosowanie: gdy potrzebujesz zarządzać też treściami stron, zasobami cyfrowymi i chcesz mieć jedno narzędzie zamiast trzech. PimCore Community Edition jest w pełni darmowy i open source bez ograniczeń wolumenowych.
Podsumowanie
PimCore to solidna platforma dla projektów które przekraczają możliwości WordPressa ale nie wymagają pełnego e-commerce jak Magento. Oparcie na Symfony sprawia że PHP developer czuje się w nim od razu swojo. Data Hub z GraphQL bez konfiguracji kodu to funkcja która wyróżnia PimCore na tle konkurencji – szczególnie przy projektach headless gdzie potrzebujesz elastycznego API do wielu kanałów.
