PHP / Magento Dev Blog

  • Publikacje
  • O autorze
  • Kontakt

PimCore – CMS + PIM + DAM, klasy obiektów, Data Hub GraphQL, integracja z Magento

by Henryk Tews / wtorek, 12 października 2021 / Opublikowano w PHP, PIM

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.

About Henryk Tews

Co możesz przeczytać następne

PHP Enumeracje zaawansowane – backed enums, metody, interfejsy, Magento 2
PHP 7.3 – JSON_THROW_ON_ERROR, elastyczny Heredoc, array_key_first/last
Podsumowanie 2025 – pipe operator, Hyvä mainstream, AI tooling obowiązkowy, 120 wpisów
  • Publikacje
  • O autorze
  • Kontakt

© 2026 Created by

GÓRA
Zarządzaj zgodą
Aby zapewnić jak najlepsze wrażenia, korzystamy z technologii, takich jak pliki cookie, do przechowywania i/lub uzyskiwania dostępu do informacji o urządzeniu. Zgoda na te technologie pozwoli nam przetwarzać dane, takie jak zachowanie podczas przeglądania lub unikalne identyfikatory na tej stronie. Brak wyrażenia zgody lub wycofanie zgody może niekorzystnie wpłynąć na niektóre cechy i funkcje.
Funkcjonalne Zawsze aktywne
Przechowywanie lub dostęp do danych technicznych jest ściśle konieczny do uzasadnionego celu umożliwienia korzystania z konkretnej usługi wyraźnie żądanej przez subskrybenta lub użytkownika, lub wyłącznie w celu przeprowadzenia transmisji komunikatu przez sieć łączności elektronicznej.
Preferencje
Przechowywanie lub dostęp techniczny jest niezbędny do uzasadnionego celu przechowywania preferencji, o które nie prosi subskrybent lub użytkownik.
Statystyka
Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do celów statystycznych. Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do anonimowych celów statystycznych. Bez wezwania do sądu, dobrowolnego podporządkowania się dostawcy usług internetowych lub dodatkowych zapisów od strony trzeciej, informacje przechowywane lub pobierane wyłącznie w tym celu zwykle nie mogą być wykorzystywane do identyfikacji użytkownika.
Marketing
Przechowywanie lub dostęp techniczny jest wymagany do tworzenia profili użytkowników w celu wysyłania reklam lub śledzenia użytkownika na stronie internetowej lub na kilku stronach internetowych w podobnych celach marketingowych.
  • Zarządzaj opcjami
  • Zarządzaj serwisami
  • Zarządzaj {vendor_count} dostawcami
  • Przeczytaj więcej o tych celach
Zobacz preferencje
  • {title}
  • {title}
  • {title}