Hey everyone, my problem is a bit complicated so i'll just split it in 
sections so you can go straight to the point.

*Context : *

I work on a web application with a great amount of "historic" code and no 
existing infrastructure. Most pages are hardcoded et go directly hit on the 
database. This results in a lot of code duplication, no possibility of code 
reusability, and greatly complexify the maintenance. I decieded to build an 
infrastructure to use for the coming developpements, and doctrine seemed to 
be a solid base for this. 

However, the new infrastructure and the old code must coexist on the same 
application, as I need to develop new features while maintening the old 
ones, and I don't have the possibility to rebuild everything from scratch. 
In order to keep everything working nicely together I have an apparently 
simple requirement : *I have to use the same database.* Since the database 
organisation is not adapted to an object architecture, I need to have 
domain entities that aren't bound to tables. 

For exemple, I have a person used for two roles, so an object oriented 
management would be to make an inheritance from Person implementing 
interfaces for these roles, but in the existing database there is an entry 
for this person in each role's table, and a serialised array in the 
parameters table used to associate them. Another exemple is a self 
referencing database for composite pattern with an inheritance system for 
different levels of entities.

*First try : *

Since doctrine simplifies dealing with the database anyway, it looks like 
the best thing to do is to build a wrapper around doctrine, exposing 
business entities that are adapted to an oriented object design while 
manipulating doctrine entities, bound to the database. My idea is to use 
decorators embedding one or more types of doctrine entities, to have the 
possibility to manipulate one table with several entities and several 
tables through a single entity when I need to. 

To benefit from doctrine's repositories, events, cache, lazyload, etc, my 
first guess was to make themselves entities, and to use an override of the 
entity manager delegating persistence to the embedded entities when 
manipulating decorators.

Ex : 

public function persist($entity) //override of entity manager's persist method
{
    if ($entity instanceof PersistenceDelegator)
        $entity->persistEmbedded($this); // simply calls persist for the 
embedded entities
    else
        parent::persist($entity);
}


This along with custom repositories delegating requests to embedded 
entities repositories and building the decorators from them, etc. 
Obviously it brings a lot of problems, and needs a lot of dirty fix to stay 
compatible with events, lazyload, etc.

*Might be better ?*

Eventually it made me realise that doctrine is really not adapted for what 
i'm trying to do, but hopefully offers good entry points to build an upper 
layer on it.

My idea so far is to make an implementation of doctrine's interfaces to 
manage my decorators, delegating persistency operations on the embedded 
entities to doctrine. I came up with this simple design :



The problem with this is that I have to reimplement doctrine 
functionnalities on my decorators, such as cache management, lazyload for 
associations, events, etc.

Is there any better way of integrating it ? Or a simple system to link my 
decorators to events, and lazyload, etc ?


*tl;dr : I want to make a layer on top of doctrine to manage non-database 
related entities. Is my solution broken ?*

Thank you for your help !

-- 
You received this message because you are subscribed to the Google Groups 
"doctrine-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/doctrine-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to