A veces incluso tengo que iniciar sesión en 2 tablas, por lo que la mayor parte del código de registro se duplica y las funciones comienzan a ser complicadas y largas.
Va a ser largo. Si su código registra mucho, será largo, ya que tendrá que iniciar sesión, y cada acción de línea que registre significará que hay una línea en su código.Sin embargo, no debería ser complicado en ningún caso, ya que el registro es una de las cosas más sencillas que puede hacer. Lo que me preocupa es que menciones "a veces incluso tengo que iniciar sesión en 2 tablas". En mi libro, una, dos, cinco, sesenta o mil tablas se realiza por una línea. El código no se duplica para cada registrador. Si está copiando y pegando una línea y cambiando $log
a $log2
, claramente lo está haciendo mal (tm).
Algunas personas sugirieron Programación Orientada a Aspectos (AOP), pero, por desgracia AOP para PHP no es aceptable para mi cliente, así que estoy buscando una solución orientada a objetos o de las mejores prácticas.
Es agradable, AOP. Sin embargo, tiene inconvenientes; como con el enfoque debug_backtrace, hay un gran golpe de rendimiento. Eso, además de que el código se vuelve cada vez más "mágico", ya que hace cosas que no están claras cuando estás mirando el código en sí. Eso aumenta el tiempo de depuración de su aplicación.
My $ 0.02? En primer lugar, no se repita: una entrada de registro por acción debería ser suficiente. Use registradores flexibles que se pueden unir a ciertas clases en tiempo de ejecución. Decida si en realidad registra el mensaje en el registrador, según "gravedad" o "tipo". Con todo, simplemente implementar el patrón Observador:
<?php
namespace Foo;
class MailService {
public function attach(Observes $observer) {
$this->observers[] = $observer;
}
public function notify($message, $type = 'notice') {
foreach($this->observers as $observer) {
$observer->notify($message, $type);
}
}
public function sendMail() {
$this->notify('Started sending mails', 'debug');
$mails = array();
foreach($mails as $mail) {
try {
$this->notify('Trying to send', 'debug');
$mail->send();
$this->notify('Mail sent succesfully', 'debug');
}
catch(Exception $e) {
$this->notify('Failed to send mail', 'notice');
}
}
$this->notify('Finished sending mail', 'debug');
}
}
interface Observes {
public function notify($message, $type = 'notice');
}
abstract class Logger implements Observes {
protected $types = array(
'debug' => 0,
'notice' => 1,
'warning' => 2,
'error' => 3
);
protected function code($type) {
return isset($this->types[$type]) ? $this->types[$type] : 0;
}
}
class FileLogger extends Logger implements Observes {
public function __construct($filename) {
$this->filename = $filename;
}
/**
* @todo replace the method body with a call to, say, file_put_contents.
*/
public function notify($message, $type = 'notice') {
if($this->code($type) > $this->code('notice')) { // only for warning and error.
echo $message . "\n";
}
}
}
class DebugLogger extends Logger implements Observes {
public function notify($message, $type = 'notice') {
if($this->code($type) === $this->code('debug')) { // only show "debug" notices.
echo $message . "\n";
}
}
}
$service = new MailService();
$service->attach(new FileLogger('yourlog.txt'));
$service->attach(new DebugLogger());
$service->sendMail();
¿Qué le parece el código debe ser similar? ¿Hay algún codigo deseable? – akond
@akond bien Estaba pensando en "adjuntar" funciones de registro a ciertas funciones en los Modelos o Controladores. algo así como registrar funciones para ejecutar en ciertos puntos en el código. Si algo de esto es incluso aplicable en PHP, por supuesto. – Songo
Buena pregunta y creo que ZF2 manejará este tipo de problema mucho más elegantemente con [EventManager] (http://mwop.net/blog/266-Using-the-ZF2-EventManager#toc_1.6). –