Php 我们应该在应用程序中的何处存储确认/错误消息?

Php 我们应该在应用程序中的何处存储确认/错误消息?,php,zend-framework,messaging,Php,Zend Framework,Messaging,我正在研究PHP和Zend。我必须在应用程序中显示不同类型的错误/确认消息。这些消息中的大多数都放在代码中。因此,如果我必须更改一条消息,那么我必须在编码这种特定类型消息的任何地方更改它 那么,将所有消息就地存储并在整个应用程序中使用它们的最佳方式是什么呢 可能的解决方案: 将所有消息存储在数据库中。(我们必须将这些消息移动到其他数据库类型。例如,如果我们从MySQL移动到SQL Server。) 使用数组将所有消息存储在单独的php类中,并使用类方法获取这些消息(问题:我们不能在其他编程语言

我正在研究PHP和Zend。我必须在应用程序中显示不同类型的错误/确认消息。这些消息中的大多数都放在代码中。因此,如果我必须更改一条消息,那么我必须在编码这种特定类型消息的任何地方更改它

那么,将所有消息就地存储并在整个应用程序中使用它们的最佳方式是什么呢

可能的解决方案:

  • 将所有消息存储在数据库中。(我们必须将这些消息移动到其他数据库类型。例如,如果我们从MySQL移动到SQL Server。)

  • 使用数组将所有消息存储在单独的php类中,并使用类方法获取这些消息(问题:我们不能在其他编程语言中使用此类)

  • 以所有语言均可接受的特殊格式存储消息,例如ini类型的文件

编辑:(查看Ozair后)

有时,我们必须更改特定记录的消息。例如:

Product No. 10 is deleted.
Product No. 15 is deleted.
处理这个案件的最佳方法是什么


谢谢

您可以在library文件夹中使用某种类型的静态类。其中包含一组常量变量,如

PRODUCT_SAVED_OK = "The product {{id}} was saved successfully";
I将有两个静态方法,用于显示错误/消息

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;
}
而不是在您的代码中,当您需要显示消息时,您只需像这样调用静态类

Messages::showMessage(Messages::PRODUCT_SAVED_OK);
这样,应用程序需要的所有消息都将包含在一个类中,如果需要更改消息,您只需在这个类中更改它


你觉得怎么样?

你首先要去看看你的问题是什么

对你来说,这就像是代码维护。我发现有效的方法是将所有这些消息存储为一个单独的类,例如名为
Notifications
(只是一个示例)

您要调用的每种类型的通知都可以存储为一个方法,因此当您调用通知程序时,它将从类成员那里获得一些消息,这些消息可以根据您的需要轻松地进行更改

将这些消息存储在数据库中并不是一种不好的方法,只是在这一点上并不是满足您需要的真正解决方案。这意味着必须维护另一个表,向代码中添加额外的查询,这些查询必须正确转义,等等。简言之,更多的维护而不是更少的维护

我会选择可以将这些消息存储为类常量的类


此外,此类成员可以很容易地进行翻译,因此这将是您的最佳选择。

如果您只想显示静态消息,就足够了

但是,如果要显示以下消息:

产品名称已更改 保存成功

你需要的不止这些。在这种情况下,您应该定义一个
消息
类,如下所示:

class Message {

    public getMessage() {
        return "";
    }
}
然后,对于产品保存的消息,您需要一个子类

class ProductSaved extends Message {

    private $productName_ = "";

    __contruct($productName) {

        $this->productName_ = $productName;

    }

    public getMessage() {

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

    }
}

如何将其存储在一些非直接编码语言中,然后使用宏将其转换为数组或静态类或任何您喜欢的内容?它可能在数据库、XML或任何您想要的内容中。错误消息只需要两个字段:消息名称和内容

例如,在XML中,可以执行以下操作:

<messages>
  <message>
    <name>PRODUCT_SAVED_OK</name>
    <content>Product no. %d has been saved successfully</content>
  </message>
  ...
</messages>
对于处理消息中的变量,我会执行
printf
s:

if ($saved_ok)
{
  printf($messages['PRODUCT_SAVED_OK'], $product_number);
}
当然,将其封装在消息类中可以获得更好、更清晰的代码。
printf
解决方案的一个缺点是您需要提前知道任何消息需要哪些参数。如果您要翻译消息,并且某些包含多个参数的消息会以另一种语言将其反转,
printf
可以处理以下问题:

// 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';

最好的方法是使用Zend_Translate(即使您的网站没有多语言版本)+.ini文件,.ini可以被其他应用程序/语言接受,您可以直接在translator中或通过Zend_Config_ini阅读。您可以用同样的方式使用xml文件。巨大的专业功能是,您可以轻松地将Zend_Translator与Zend_表单连接起来,并具有已翻译的标签和验证错误。

“我使用Zend Framework的Translator将表单验证消息字符串存储在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);
然后在./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"
然后以以下形式:

    $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',
                    ),

                    .....
                ),
            ),

我认为您可以采取比Ozair建议的更简单的方法。我在回答中更改了代码以向您展示如何操作。基本上,常量变量将具有用于动态信息的占位符。只需按代码中所示的数组格式传递数据。foreach循环将负责将您传递的数据放入消息中。
    $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',
                    ),

                    .....
                ),
            ),