Skip to content

Package and bundle structure and namespaces

If you wish to contribute to Ibexa DXP development, you need to adhere to the package and bundle structure and namespace standards.

The following conventions apply to contributions to Ibexa core code, not to third party packages.

Note

New code needs to follow the rules outlined here. They're being applied progressively to existing code.

Root PHP namespace

Define Ibexa DXP core PHP code in a namespace with the following prefix:

1
namespace Ibexa;

A package which groups some DXP features can use an additional prefix, for example:

1
namespace Ibexa\Commerce;
1
namespace Ibexa\Personalization;

Packages

The general package directory structure and corresponding PHP namespace mapping are:

1
2
3
4
5
6
7
8
9
.
+-- src
|   +-- bundle (`Ibexa\Bundle\<PackageName>`)
|   +-- contracts (`Ibexa\Contracts\<PackageName>`)
|   +-- lib (`Ibexa\<PackageName>`)
+-- tests
|   +-- bundle (`Ibexa\Tests\Bundle\<PackageName>`)
|   +-- integration (`Ibexa\Tests\Integration\<PackageName>`)
|   +-- lib (`Ibexa\Tests\<PackageName>`)

If a package doesn't contain some of the described parts, you can skip those directories.

Implementation (lib)

The src/lib directory and its corresponding Ibexa\<PackageName> namespace are meant for internal implementation not tied to the Symfony Framework.

Examples:

1
namespace Ibexa\Search;
1
namespace Ibexa\Commerce\Shop;

Bundles

The bundle class definition in the src/bundle directory must be:

1
2
3
namespace Ibexa\Bundle\<PackageName>;

class Ibexa[ProductGroup]<PackageName>Bundle // ...

Examples:

1
2
3
namespace Ibexa\Bundle\Search;

class IbexaSearchBundle // ...
1
2
3
namespace Ibexa\Bundle\Commerce\Shop;

class IbexaCommerceShopBundle // ...

Contracts

A package may introduce a namespace for contracts, to be consumed by first and third party packages and projects, which must be prefixed as:

1
namespace Ibexa\Contracts;

Examples:

1
namespace Ibexa\Contracts\Kernel;
1
namespace Ibexa\Contracts\SiteFactory;
1
namespace Ibexa\Contracts\Commerce\Shop;

That namespace needs to be mapped to the src/contracts directory of a package.

Note

Backward compatibility for interfaces and objects defined in the Contracts namespace is guaranteed.