我正在研究PHP和Zend。我必须在应用程序中显示不同类型的错误/确认消息。大多数这些消息都放在代码中。因此,如果我必须更改一条消息,那么我必须在编码此特定类型消息的任何地方更改它。
那么将所有消息存储到位并在整个应用程序中使用它们的最佳方法是什么。
可能的解决方案:
将所有邮件存储在数据库中。 (我们必须将这些消息移动到其他数据库类型。例如,如果我们从MySQL迁移到SQL Server。)
使用数组将所有消息存储在单独的php类中,并使用类方法获取这些消息(问题:我们不能在其他编程语言中使用此类。)
以适合所有语言的特殊格式存储讯息,例如ini类型的文件。
编辑: (看完Ozair的Answer后)
有时我们必须更改特定记录的消息。例如:
Product No. 10 is deleted.
Product No. 15 is deleted.
处理此案件的最佳方法是什么?
谢谢
答案 0 :(得分:7)
您可以在库文件夹中使用某种静态类。其中包含一组常量变量,如
PRODUCT_SAVED_OK = "The product {{id}} was saved successfully";
我将有两个静态方法来处理显示错误/消息
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);
这样,应用程序所需的所有消息都将包含在一个类中,如果需要,消息发生更改,您只需要更改此类。
您怎么看?
答案 1 :(得分:2)
如何将它存储在一些非直接编码语言中,然后使用宏将其转换为数组或静态类或任何你喜欢的?它可能位于数据库,XML或您喜欢的任何内容中。您只需要2个字段来显示错误消息:消息的名称和内容。
例如,在XML中你可以这样做:
<messages>
<message>
<name>PRODUCT_SAVED_OK</name>
<content>Product no. %d has been saved successfully</content>
</message>
...
</messages>
然后有一些过程将其转换为数组或最适合您项目的东西。例如,我将其保存为数组:
$messages = array(
'PRODUCT_SAVED_OK' => 'Product no. %d has been saved successfully',
...
);
为了处理消息中的变量,我会printf
s:
if ($saved_ok)
{
printf($messages['PRODUCT_SAVED_OK'], $product_number);
}
当然,将其封装在Message类中以获得更好,更清晰的代码。 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';
答案 2 :(得分:1)
你必须首先看看你的问题是什么。
对你而言似乎是代码维护。我发现的工作是将所有这些消息存储为一个单独的类,例如名为Notifications
(仅作为示例)
您可以调用的每种类型的通知都可以存储为方法,因此当您调用通知程序时,它会从类成员那里获得一些消息,这些消息可以根据您的需要轻松更改。
将这些消息存储在数据库中并不是一种糟糕的方法,只是不能满足您的需求。这意味着必须维护另一个表,为您的代码添加额外的查询,这些查询必须正确转义等等。简而言之,更多维护而不是更少。
我会选择可以将这些消息存储为类常量的类。
此外,这个班级的成员可以很容易地被翻译,因此这将是你最好的选择。
答案 3 :(得分:1)
如果您只想显示静态消息,ElGabbu's unedited answer就足够了。
但是,如果要显示以下消息:
产品产品名称已经存在 保存成功。
你需要更多。在这种情况下,您应该按如下方式定义Message
类:
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.";
}
}
答案 4 :(得分:1)
最好的方法是使用Zend_Translate(即使您没有网站的多语言版本)+ .ini文件,.ini也可以被其他应用程序/语言接受,您可以直接在翻译中或通过Zend_Config_Ini阅读。您可以以相同的方式使用xml文件。非常专业的是,您可以轻松地将Zend_Translator与Zend_Form连接,并且还可以翻译标签和验证错误。
答案 5 :(得分:0)
“我使用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',
),
.....
),
),