Código
<?php interface ActiveRecord { public function save(); public function update(); public function delete(); public function find($id); public function all(); }
Y una clase que lo implementa:
Código
<?php abstract class ActiveRecordImpl implements ActiveRecord { public function save() { } public function update() { } public function delete() { } public function find($id) { } public function all() { } }
Además dos clases: Customer y User (con sus __get y __set) que heredan de Active Record.
Bien, supongamos que el método save() de ActiveRecord necesita guardar un objeto en la BD de la siguiente manera:
Código
<?php public function save() { $caller = REFERENCIA_AL_OBJETO_LLAMANTE; $callerClass = get_class($caller); // 'Customer' o 'User' // obtiene el servicio dinámicamente, de acuerdo al objeto llamante $service = ServiceFactory::create($callerClass); // le envía el objeto llamante al servicio Customer para que // lo guarde en la BD $service->save($caller); }
El método save() obtiene una referencia al método que lo llamó (que puede ser un objeto tipo Customer o User), y obtiene la clase del objeto llamante para poder crear su servicio respectivo. Posteriormente, el servicio guarda el objeto por medio del método save()
La clase ServiceFactory solo crea y devuelve un servicio para el tipo de clase indicado:
Código
<?php public static function create($class) { switch ($class) { case 'Customer': return new CustomerService(); case 'User': return new UserService(); } }
Y los servicios de 'Customer' y 'User' hacen uso de sus DAOs respectivos:
Código
<?php class CustomerService { public function save(Customer $customer) { new CustomerDAO()->save($customer); } }
Código
<?php class UserService { public function create(User $user) { new UserDAO()->save($user); } }
Ahora, para guardar un objeto 'Customer' y 'User' se haría lo siguiente:
Código
<?php $customer = new Customer(); $customer->username = $username; $customer->email = $email; $customer->password = $password; $customer->dni = $dni; $customer->address = $address; $user = new User(); $user->username = $username; $user->email = $email; $user->password = $password;
¿Es ésto posible? Si es es así, ¿cómo podría obtener la referencia del objeto llamante?