Kaliop Content Decorator Bundle is an Ibexa extension inspired by
eZObjectWrapperBundle. It lets you work with Ibexa Content objects as
typed models plus dedicated repositories.
Instead of using raw content objects everywhere, you map content types to custom classes extending
Kaliop\Contracts\ContentDecorator\Model\ContentDecorator.
| Bundle line | Ibexa | Symfony | PHP |
|---|---|---|---|
| 1.x | 4.6 | 5.4 LTS | >= 8.1 |
composer require kaliop/content-decorator-bundleIf Symfony Flex does not enable the bundle automatically, register it in config/bundles.php:
return [
Kaliop\Bundle\ContentDecorator\KaliopContentDecoratorBundle::class => ['all' => true],
];- Configure mappings:
# config/packages/kaliop_content_decorator.yaml
kaliop_content_decorator:
default_class: App\Model\GenericContent
default_repository_class: Kaliop\ContentDecorator\Repository\ContentRepository
mappings:
App:
namespace: 'App\Model'
dir: '%kernel.project_dir%/src/Model'- Create a decorator class:
<?php
declare(strict_types=1);
namespace App\Model;
use Kaliop\ContentDecorator\Attribute\Decorator;
use Kaliop\Contracts\ContentDecorator\Model\ContentDecorator;
#[Decorator(repositoryClass: App\Repository\ArticleRepository::class, contentTypes: ['article'])]
final class Article extends ContentDecorator
{
}- Create a repository:
<?php
declare(strict_types=1);
namespace App\Repository;
use Kaliop\ContentDecorator\Repository\AbstractContentRepository;
final class ArticleRepository extends AbstractContentRepository
{
public function findByAuthorId(int $authorId): array
{
// Implement query logic
return [];
}
}- Use
ContentDecoratorManagerin your service/controller:
$repository = $contentDecoratorManager->getRepository(App\Model\Article::class);
$articles = $repository->findByAuthorId(42);kaliop_content_decorator:
default_class: App\Model\GenericContent
default_repository_class: Kaliop\ContentDecorator\Repository\ContentRepository
mappings:
App:
namespace: 'App\Model'
dir: '%kernel.project_dir%/src/Model'
content_types:
article: App\Model\ArticleDecorators are not Symfony services. Use injectors to add services during decoration. Implement
Kaliop\Contracts\ContentDecorator\Injector\InjectorInterface and tag as kaliop.content_decorator.injector
(autoconfiguration handles this automatically).
Default injectors:
ConfigResolverInjectorIbexaRepositoryInjectorImageVariationInjectorLoggerInjectorManagerInjectorTranslatorInjectorUrlGeneratorInjector
- Decorated instances are cached in memory per request.
- Proxy classes can cache selected method results.
- Mark methods with
#[Cacheable]. - Method parameters must be serializable.
use Kaliop\ContentDecorator\Attribute\Cacheable;
#[Cacheable]
public function getExpensiveComputation(): array
{
return [];
}The tool comes with quite a few built-in fixers, but everyone is more than welcome to contribute more of them.
This library is released under the MIT license. See the included LICENSE file for more information.