2011-05-31 22 views
9

Estoy trabajando en PHP y Zend. Tengo que mostrar diferentes tipos de mensajes de error/confirmación en la aplicación. La mayoría de estos mensajes se colocan en código. Entonces, si tengo que cambiar un mensaje, entonces tengo que cambiarlo donde esté codificado este tipo particular de mensaje.¿Dónde deberíamos almacenar mensajes de confirmación/error en la aplicación?

Entonces, ¿cuál es la mejor manera de almacenar todos los mensajes en su lugar y usarlos en toda la aplicación.

soluciones posibles:

  • almacenar todos los mensajes en la base de datos. (Tenemos que mover estos mensajes a otro tipo de base de datos. Por ejemplo, si nos movemos de MySQL a SQL Server.)

  • tienda todos los mensajes en php class separada utilizando matriz y obtener estos mensajes a través de métodos de clase (Problema : No podemos utilizar esta clase en otros lenguajes de programación.)

  • Almacene el mensaje en un formato especial que sea aceptable para todos los idiomas, por ejemplo, en un tipo de archivos.

EDIT:(Después de mirar de Answer Ozair)

A veces hay que cambiar el mensaje de registro en particular. Por ejemplo:

Product No. 10 is deleted. 
Product No. 15 is deleted. 

¿Cuál será el mejor método para manejar este caso?

Gracias

Respuesta

7

Usted podría tener algún tipo de clase estática en la carpeta de biblioteca. Que contendría un conjunto de variables constantes, como

PRODUCT_SAVED_OK = "The product {{id}} was saved successfully"; 

El Tendría dos métodos estáticos que se ocupan de mostrar el error/mensaje

public static function showMessage($message , $data = array("id" => "10"){ 
    foreach($data as $key => $value){ 
     $message = str_replace("{{" . $key . "}}", $value , $message); 
    } 
    echo $message; 
} 

public static function showError($error){ 
    echo $error; 
} 

Que en su código cada vez que necesite para mostrar el mensaje simplemente se le invoca la clase estática como tal ...

Messages::showMessage(Messages::PRODUCT_SAVED_OK); 

de esa manera todos los mensajes de las necesidades de aplicación estarán contenidos en una clase y si es necesario que el mensaje ch anges solo tienes que cambiarlo esta clase.

¿Qué opinas?

+0

+1 Gracias. ¿Puedes ver mi edición en mi pregunta? – Student

+1

Creo que puedes tomar un enfoque más simple que lo sugerido por Ozair. Cambié el código en mi respuesta para mostrarte cómo. Básicamente, las variables constantes tendrían marcadores de posición para la información dinámica. Simple pase los datos en el formato de matriz como se indica en el código. El ciclo foreach se ocupará de poner los datos que pasó en el mensaje. –

1

Lo primero que tiene que ver es cuál es su problema.

Para usted, parece que el mantenimiento del código.Lo que he encontrado que funciona es almacenar todos estos mensajes como una clase separada, por ejemplo, llamada Notifications (solo un ejemplo)

Cada tipo de notificación que llamar se puede almacenar como un método por lo que cuando llame al notificador lo haría recibe un mensaje de los miembros de la clase que se puede cambiar fácilmente según tus necesidades.

Almacenar estos mensajes en una base de datos no es una mala manera de hacerlo, simplemente no es la solución real a su necesidad en este momento. Eso significa tener que mantener otra tabla agregando consultas adicionales a su código que tienen que escaparse correctamente, etc. En resumen, más mantenimiento en lugar de menos.

Me gustaría ir a la clase en la que puede almacenar estos mensajes como constantes de clase.

Además, los miembros de esta clase pueden traducirse muy fácilmente, por lo que sería su mejor opción.

+0

+1 Edité mi pregunta. Por favor, eche un vistazo. Gracias – Student

1

Si solo desea mostrar mensajes estáticos, ElGabbu's unedited answer será suficiente.

Sin embargo, si desea mostrar los mensajes como:

El producto nombre del producto ha sido guardado correctamente.

Necesitará más que eso. En ese caso, debería definir una clase Message de la siguiente manera:

class Message { 

    public getMessage() { 
     return ""; 
    } 
} 

Luego de mensaje del producto salvado, necesita una subclase

class ProductSaved extends Message { 

    private $productName_ = ""; 

    __contruct($productName) { 

     $this->productName_ = $productName; 

    } 

    public getMessage() { 

     return "The product $productName_ has been saved successfully."; 

    } 
} 
2

¿Qué hay de almacenarlo en algún lenguaje de codificación no directo y luego usar una macro para transformar esto en una matriz o clase estática o lo que quieras? Puede estar en la base de datos, XML o lo que quieras. Solo necesitaría 2 campos para un mensaje de error: el nombre del mensaje y el contenido.

Por ejemplo, en XML que puede hacer esto:

<messages> 
    <message> 
    <name>PRODUCT_SAVED_OK</name> 
    <content>Product no. %d has been saved successfully</content> 
    </message> 
    ... 
</messages> 

Luego tienen algún proceso para transformar esto en arrays o lo que mejor se adapte a su proyecto. Por ejemplo, me gustaría guardar esta a una matriz:

$messages = array(
    'PRODUCT_SAVED_OK' => 'Product no. %d has been saved successfully', 
    ... 
); 

Y para hacer frente a las variables dentro de los mensajes, lo haría printf s:

if ($saved_ok) 
{ 
    printf($messages['PRODUCT_SAVED_OK'], $product_number); 
} 

Por supuesto, este encapsular dentro de una clase de mensajes para un código mejor y más limpio. Una desventaja de la solución printf es que necesita saber de antemano qué parámetros necesita cada mensaje. Si desea traducir el mensaje y algún mensaje con más de un parámetro obtiene ellos invierten en otro idioma, printf puede hacer frente a este:

// In both cases, day would be 3rd parameter to printf, month the second and year the first 
$spanish = 'Hoy es %3$d/%2$d/%1$d'; 
$english = 'Today is %2$d/%3$d/%1$d'; 
1

La mejor manera sería utilizar Zend_Translate (incluso si usted don' t tiene una versión en varios idiomas de su sitio web) + archivo .ini, .ini puede ser aceptado por otras aplicaciones/idiomas y puede leerlo directamente en el traductor o a través de Zend_Config_Ini. Puede usar el archivo xml de la misma manera.Un gran beneficio es que puedes conectar Zend_Translator fácilmente con Zend_Form y también puedes traducir etiquetas y errores de validación.

0

"I used Traductor de Zend Framework para almacenar cadenas de mensajes de validación de formularios en archivos ini:

module.php

use Zend\Mvc\I18n\Translator; 
use Zend\Validator\AbstractValidator; 


class Module 
{ 
    public function onBootstrap(MvcEvent $e) 
    { 
     .... 

     $translatorInterface = new TranslatorInterface(); 

     $translatorInterface->addTranslationFile('ini', dirname(__FILE__) . '/language/en_UK.ini'); 

     $translator = new Translator($translatorInterface); 

     AbstractValidator::setDefaultTranslator($translator); 

Luego, en ./module/MyModule/language/en_UK.ini

[tag_approved_but_no_id] 
message  = tag_approved_but_no_id 
translation = "You have entered 'Yes' but not entered a tag ID must be entered" 

[tag_unapproved_but_no_reason] 
message  = tag_unapproved_but_no_reason 
translation = "You have entered 'No' but not entered a reason" 

a continuación, en la forma:

$inputFilter->add(array(
     'name'  => 'hasTagApproval', 
     'required' => true, 
     'validators' => array(
      array(
       'name' => 'Callback', 
       'options' => array(
        'messages' => array(
         \Zend\Validator\Callback::INVALID_VALUE => 'tag_approved_but_no_id', 
        ), 

        ..... 
       ), 
      ), 
Cuestiones relacionadas