MVC中的输入验证

时间:2015-10-20 11:49:46

标签: codeigniter model-view-controller

我需要一些关于MVC设计的帮助。 MVC和CODEIGNITER的大多数教程都在控制器中进行输入验证。这是一个好习惯吗?
假设我们实现REST或SOAP API,那么我们将拥有不同的控制器,对于所有这些控制器,我需要复制我的代码。稍后,如果更改了任何验证规则,它将会波及所有控制器。不应该所有的验证都应该在Model而不是Controller中吗?
还有一件事我想问一下。当我试图保持我的功能尽可能紧密时,我在模型和控制器的功能之间得到一对一的关系。可以,还是我做错了?

2 个答案:

答案 0 :(得分:0)

  1. 关于在Controller中进行输入验证 答。是的,这是大多数MVC中普遍接受的做法。但是,在过去几年中,由于AJAX框架的出现和JavaScript的更多采用,许多UI验证都在UI本身完成(称为客户端验证)。这些通常显示为javascript警告框,除非他修复了这些错误,否则不允许用户继续操作。所以,我会说控制器/视图助手是事实上已经完成验证的地方,但你应该在可行的情况下考虑客户端验证。它还可以节省您到服务器的行程。

  2. 如果您公开与SOAP / REST相同的功能 答。现在,您可以注释相同的控制器方法,使它们作为Web服务端点工作。因此,您的控制器可以为基于Web的请求以及SOAP / REST请求提供服务。 但需要注意的是 - 你的形状豆/支持豆应该设计得非常好。我见过将hibernate模型对象用作表单支持对象的代码。当你从表单支持对象生成WSDL时,这会很棘手,因为hibernate模型对象可能有许多链接实体,并且最终在请求/响应中有非常复杂的xml结构。 但是,如果您将后端bean设计为细粒度的,即没有复杂的对象,那么您应该放心地使用现有的控制器/控制器方法作为SOAP / REST的Web服务端点。

    < / LI>
  3. 关于模型层内的验证 答。您可以使用此拇指规则来确定放置哪些验证的位置 -
    • 商业验证应在模型/服务中进行
    • 复杂的客户端验证,在客户端不可行,应该在控制器/视图助手中进行。
    • UI验证(格式化/空检查)应通过客户端/ javascript验证
    • 进行
  4. 关于控制器和模型/服务的功能之间的一对一关系 答。没关系。只记得让一个控制器方法与其各自的模型方法进行对话。如果需要多个模型来处理请求,那么该模型方法应该充当来自多个模型的信息聚合器,即控制器应该联系其主模型,主模型应该联系其他模型。

答案 1 :(得分:0)

这是一个好习惯吗?根据我的经验,是的。

要记住的一件事是任何给定的控制器都可以显示许多不同的页面。例如,考虑一下&#34;仪表板&#34;这可能有多个任务,每个任务都需要自己的页面。

粗略的伪代码&#34;仪表板&#34;控制器可能看起来像这样:

class Dashboard extends CI_Controller {
  public function __construct(){
    parent :: __construct();
    $this->load->helper(array('form', 'url'));
    $this->load->library('form_validation');
    $this->load->model('somemodel_model');
  }
  public function index(){
   //displays a task selection page with links to various tasks
  }  
  public function admins(){
    //some kind of interface to display and edit admin level users
  }
  public function users(){
    //CRUD for dashboard users
  }
}

使用此控制器,任务选择页面将打开baseurl/dashboard,管理员页面baseurl/dashboard/admins和用户CRUD baseurl/dashboard/users。因为它们中的每一个共享相同的类,所以这些页面中的所有/许多页面(例如验证)所需的代码可以在构造函数中和/或使用私有方法来实现。你可能已经知道了这一切。请记住,AJAX响应者也可以使用相同的技术驻留在控制器中。

关于保持验证规则DRY并简化规则更改所需的工作,CI可以在配置文件中存储规则集,以便在多种情况下轻松重用。 Read about it.