zf-doctrine-repository
, (*1)
This is a replacement for the default repository structure of
Doctrine ORM. This replacement implements a plugin architecture
for extensisons to repositories., (*2)
For instance, if you need access to an encryption/decryption resource
inside your repository you could implement it as a plugin accessible as, (*3)
$this->plugin('encryption')->encrypt($value);
Why use this repository structure?
The default repository for Doctrine ORM gives no access to resources
outside Doctrine. And the Doctrine ORM Object Manager does not give
access to a dependency injection container. So when your applications
require more from their repositories the only option is to write your
own dependency injection enabled repository factory. To create a standard
way to organize this dependency injection repository factory: this is
an acceptable solution., (*4)
Installation
Installation of this module uses composer. For composer documentation, please refer to
getcomposer.org., (*5)
$ composer require api-skeletons/zf-doctrine-repository
Once installed, add ZF\Doctrine\Repository
to your list of modules inside
config/application.config.php
or config/modules.config.php
., (*6)
zf-component-installer
If you use zf-component-installer,
that plugin will install zf-doctrine-repository as a module for you., (*7)
Configuration
No manual configuration is required to use this module., (*8)
This module makes these changes to your
doctrine.entitymanager.orm_default
configuration:, (*9)
namespace ZF\Doctrine\Repository;
...
'doctrine' => [
'configuration' => [
'orm_default' => [
'repository_factory' => RepositoryFactory::class,
'default_repository_class_name' => ObjectRepository::class,
],
],
],
If your application already has a default repository class you can edit it to implement
ZF\Doctrine\Repository\ObjectRepositoryInterface
and the RepositoryFactory can use it., (*10)
Creating a Plugin
The config key for the repository plugin service locator is zf-doctrine-repository-plugin
.
Your plugin must implement ZF\Doctrine\Repository\Plugin\PluginInterface
, (*11)
The __construct
of your Plugin will take an array including the repository and any other parameters.
Access to the repository gives you access to the ObjectManager., (*12)
Use the
testing boolean plugin
and testing boolean plugin configuration
as a template., (*13)
Available Plugins
zf-doctrine-repository-query-provider - zfcampus/zf-apigility-doctrine
includes Query Providers which may take the current authenticated user and add complex filters to a a QueryBuilder object in
order to filter whether the user has access to a given entity. This filtering mechanism can be used across a whole
application whenever authorized access is needed to an entity., (*14)
use Database\Entity\User;
// Return a single User entity fetched by applying the User Query Provider to a given `$id`
$objectManager->getRepository(User::class)->plugin('queryProvider')->find($id);
Future Plugin Plans
This repository is forward-looking and architected to support the needs
today and into the future. Here are examples of repository plugins
to be developed:, (*15)
zf-doctrine-repository-audit - A trigger-happy application will create a structure of triggers
on all tables accessible as Doctrine entities. Data would be accessible
directly or to access the audit data with a plugin:, (*16)
use Database\Entity\User;
// Return the date an entity was created using the audit trail.
$objectManager->getRepository(User::class)->plugin('audit')->getCreatedAt(User $userEntity);
// Return the date an entity was last modified using the audit trail.
$objectManager->getRepository(User::class)->plugin('audit')->getUpdatedAt(User $userEntity);
// Return the complete audit trail for an entity
$objectManager->getRepository(User::class)->plugin('audit')->getAuditTrail(User $userEntity);