【问题标题】:Which pattern and how to structure this [Different serviceHandlers, structure and validation]?哪种模式以及如何构造这个[不同的服务处理程序、结构和验证]?
【发布时间】:2013-04-11 10:36:00
【问题描述】:

好的,所以我正在尝试理解所有这些模式。

好的,所以我正在 CodeIgniter 中编写一个应用程序,它需要能够使用 SOAP(可能是 XML、逗号分隔等)向不同类型的公司发送有关汽车和客户的数据。

但他们都需要同样的东西。

我想让它尽可能动态化,并确保它易于编写测试。

所以服务应该采取一些措施:

  • 处理程序
  • 申请者 [1-2]
  • 参数
  • 对象

我开始创建不同的类

Gr8Exp 北车 SwePerf

每个实现接口iServiceRequest

interface iServiceRequest{
    /**
     * Send the request to the company server.
     */
    function sendRequest();
    /**
     * Saves the response into the database.
     */
    function saveResponse();
    /**
     * Prepares the request to the company, setting info from form and shit.
     */
    function prepareRequest();
    /**
     * Soap, XML, CSV, JSON
     * @param type $method
     */
    function setRequestHandler(iServiceRequestHandler $handler);
}

然后他们需要根据我放入的处理程序来构建 Soap、XML、CSV、JSON 请求。

在那些需要被验证的人之后(不是所有人都做了)我使用了:

interface iAdaptServiceRequest{
    /**
     * Structure the array information and put it into an object structure in the right place.
    */
    function structure(array $info);
    /**
     * Make all the checks for the function
     */
    function validateInfo();
}

但我被卡住了,当我只使用 SOAP 请求时它工作得非常好;但现在。由于我需要以不同的方式格式化它们,因此对每种类型的请求或我不知道该怎么做的公司使用不同的处理程序。 我可以将它们放在不同的文件夹中并在不同的文件夹中重新创建类。但这不是一个好习惯,因为我一直在重复代码。

最后我想像这样运行一些链接:

$result = $m->prepareRequest()->sendRequest()->saveResponse();

有什么建议吗??

【问题讨论】:

  • 使用类似 ->setType('json') ..etc 然后让您的请求处理程序使用它来构造数据。
  • 您必须规范化您的数据,以便轻松输出您想要的任何结构,然后根据请求的类型将数据传递给将格式化数据并返回它的处理程序,它会比复制文件要容易得多 + 它将允许您在未来添加更多内容。

标签: php codeigniter design-patterns


【解决方案1】:

恕我直言:

-- 创建/使用前端控制器。

-- 前端控制器决定使用哪个请求处理程序(JSON、SOAP、XML 等)。

-- 请求处理程序生成一个通用的“请求”对象,该对象在所有接口中的行为都相同,基本上将变量放入“请求对象”内的通用命名格式

-- 确定将请求发送到哪个服务,并将请求对象发送到那里

-- 服务处理请求对象并生成响应对象

-- 控制器创建一个适当的 (JSON/SOAP/XML) 视图对象以将响应对象处理为正确的视图类型,并且视图将您的响应作为该类型输出。

【讨论】:

  • 好吧,我现在已经这样做了。但现在我的控制器中有很多任务。案例不多。像这样:$object->setRegistrationNumber($regNr)。我听说它应该是一个干净的控制器。据我了解,CI 中的 MVC 模式并不是真正的 MVC。我应该将作业转移到模型中,然后做同样的事情吗?或者我可以将它们保存在控制器中。我知道它无论如何都有效。但我希望它有一个“适当的”结构。我会等几天看看回复,然后如果没有更好的情况出现,我会稍后接受你的回答。我认为这回答了我的问题。
  • 控制器正在提供控制代码。其中一些正在将变量转移到您的模型中。没事儿。但是,如果在设置变量期间需要将其乘以 50,则应将其放入模型中。基本上,与该模型数据集相关的任何需要重复发生的东西都应该放入模型中。
【解决方案2】:

我会使用类似你的东西:$result = $m->prepareRequest('JSON')->sendRequest()->saveResponse();,但指定我要发送的数据格式。

prepareRequest(string $type) 方法会检查格式并调用另一个方法将您的数据转换为相应的格式。

类似这样的:

function prepareRequest(string $type){
     if ($type == 'json'){
          $this->convert2json();
     }
     if ($type == 'xml'){
          $this->convert2xml();
     }
     // And so on
}

【讨论】:

    【解决方案3】:

    对于 MVC 或观察者模式经常会产生混淆。这不是这种模式适用的情况。在 MVC 模式中,视图和模型是相互关联的。视图必须根据主题的信息进行自我更新。数据库中的视图和基础表就是一个很好的例子。这不是你想要的。

    适合这个问题的设计模式是建造者模式。 Builder 模式由四种协作的类类型组成: 1. 建设者, 2.一个ReaderManager, 3. ConverterManager,和 4. 一个数据对象。 ReaderManager 正在使用解释器模式。可以使用状态模式进行转换。 ReaderManager(一些 DataObject)的输出是 ConversionManager 的输入。这可以使用抽象类而不是接口来完成(我更喜欢以数据为中心的类)。 Builder 将 ReaderManager 与 ConverterManager 连接起来,并负责数据的传输。

    几年前我写过关于设计模式的文章。构建器模式是我描述的模式之一,这是该页面的链接: http://www.loekbergman.nl/InsideArchitecture/TheProcess/DesignPatterns/Builder 它显示了该模式的 UML 图。 在下一个链接中,您可以下载包含一些设计模式示例的 jar。其中之一是建造者模式: http://www.loekbergman.nl/InsideArchitecture/DownloadsAndLicense 我几年前就写过这段代码,所以我给你这个代码没有保证。 (在这种情况下,这是正确的术语吗?) 在代码中,您可以看到一个名称为规范的文件夹。这是解释器模式的另一个例子。 (在Builder模式中当然也有这种模式的例子)。

    完整的是 MVC - 模式的链接: http://www.loekbergman.nl/InsideArchitecture/TheProcess/DesignPatterns/Observer 和解释器模式: http://www.loekbergman.nl/InsideArchitecture/TheProcess/DesignPatterns/Interpreter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 2018-09-24
      • 2019-05-12
      • 1970-01-01
      • 2013-11-30
      相关资源
      最近更新 更多