我想为webservice通信创建xml消息。 应该从可重用元素池中创建这些消息。 因此我创造了不同的课程。 一个“工厂”类,只返回一个消息类。 一个元素类,由可重用的部分和作为所需xml消息蓝图的消息类组成。
我的代码提供了预期的结果,但我正在寻找最佳实践。 特别是一种摆脱在每个消息类中重写相同的 save()和* __ construct *方法的方法。
提前致谢
// class to create webservice messages
class Messages{
private function __construct(){}
public static function get($type) {
//some error handling if class not exists
return new $type;
}
}
// message no.1
class Message_1 extends Elements{
protected $root;
public function __construct() {
parent::__construct();
$this->root = $this->createElement("message1");
}
public function add_anotherElement(){
$this->root->appendChild($this->add_anotherElementBlock("foo", "bar"));
}
public function add_element(){
$this->root->appendChild($this->add_someElementBlock("foo", "bar"));
}
public function save(){
return $this->saveXML($this->root);
}
}
// message no.2
class Message_2 extends Elements {
protected $root;
public function __construct() {
parent::__construct();
$this->root = $this->createElement("message2");
}
public function add_elements(){
$this->root->appendChild($this->add_anotherElementBlock("foo", "bar"));
$this->root->appendChild($this->add_someElementBlock("foo", "bar"));
}
public function save(){
return $this->saveXML($this->root);
}
}
// reusable elements
class Elements extends DOMDocument{
public function __construct() {
parent::__construct();
}
public function add_someElementBlock($foo, $bar) {
$node = $this->createElement("root");
$attr = $this->createAttribute("id");
$attr->value = $foo;
$node->appendChild($attr);
$subnode = $this->createElement("sub",$bar);
$node->appendChild($subnode);
return $node;
}
public function add_anotherElementBlock($foo, $bar) {
$node = $this->createElement("anotherRoot");
$subnode = $this->createElement("anotherSubNode",$bar);
$attr = $this->createAttribute("anotherAttribute");
$attr->value = $foo;
$subnode->appendChild($attr);
$node->appendChild($subnode);
return $node;
}
}
$message1 = Messages::get('Message_1');
$message1->add_element();
$message1->add_anotherElement();
$message2 = Messages::get('Message_2');
$message2->add_elements();
//********************************************
echo "<pre>";
print_r(htmlentities($message1->save()));
echo "</pre>";
echo "<hr />";
echo "<pre>";
print_r(htmlentities($message2->save()));
echo "</pre>";
答案 0 :(得分:1)
感谢hek2mgl建议,我改变了我的课程。对我来说似乎很好,希望有人发现它也很有帮助。
// class to create webservice messages
class Messages{
private function __construct(){}
public static function get($type) {
//some error handling if class not exists
return new $type;
}
}
// message no.1
class Message_1 extends Elements{
public function __construct() {
parent::__construct();
$this->root = $this->createElement("message1");
}
public function add_anotherElement(){
$this->root->appendChild($this->add_anotherElementBlock("foo", "bar"));
}
public function add_element(){
$this->root->appendChild($this->add_someElementBlock("foo", "bar"));
}
}
// message no.2
class Message_2 extends Elements {
public function __construct() {
parent::__construct();
$this->root = $this->createElement("message2");
}
public function add_elements(){
$this->root->appendChild($this->add_anotherElementBlock("foo", "bar"));
$this->root->appendChild($this->add_someElementBlock("foo", "bar"));
}
}
// message no.3
class Message_3 extends Elements {
public function __construct() {
parent::__construct();
$this->root = $this->createElement("message3");
}
public function add_element(){
// unique Element
$this->root->appendChild($this->createElement("foo", "bar"));
}
}
// reusable elements
class Elements extends DOMDocument{
protected $root;
public function __construct() {
}
protected function add_someElementBlock($foo, $bar) {
$node = $this->createElement("root");
$attr = $this->createAttribute("id");
$attr->value = $foo;
$node->appendChild($attr);
$subnode = $this->createElement("sub",$bar);
$node->appendChild($subnode);
return $node;
}
protected function add_anotherElementBlock($foo, $bar) {
$node = $this->createElement("anotherRoot");
$subnode = $this->createElement("anotherSubNode",$bar);
$attr = $this->createAttribute("anotherAttribute");
$attr->value = $foo;
$subnode->appendChild($attr);
$node->appendChild($subnode);
return $node;
}
public function getMessage(){
return $this->saveXML($this->root);
}
}
$message1 = Messages::get('Message_1');
$message1->add_element();
$message1->add_anotherElement();
$message2 = Messages::get('Message_2');
$message2->add_elements();
$message3 = Messages::get('Message_3');
$message3->add_element();
//********************************************
echo "<pre>";
print_r(htmlentities($message1->getMessage()));
echo "</pre>";
echo "<hr />";
echo "<pre>";
print_r(htmlentities($message2->getMessage()));
echo "</pre>";
echo "<hr />";
echo "<pre>";
print_r(htmlentities($message3->getMessage()));
echo "</pre>";