我需要一些关于MVC设计的帮助。
MVC和CODEIGNITER的大多数教程都在控制器中进行输入验证。这是一个好习惯吗?
假设我们实现REST或SOAP API,那么我们将拥有不同的控制器,对于所有这些控制器,我需要复制我的代码。稍后,如果更改了任何验证规则,它将会波及所有控制器。不应该所有的验证都应该在Model而不是Controller中吗?
还有一件事我想问一下。当我试图保持我的功能尽可能紧密时,我在模型和控制器的功能之间得到一对一的关系。可以,还是我做错了?
答案 0 :(得分:0)
关于在Controller中进行输入验证 答。是的,这是大多数MVC中普遍接受的做法。但是,在过去几年中,由于AJAX框架的出现和JavaScript的更多采用,许多UI验证都在UI本身完成(称为客户端验证)。这些通常显示为javascript警告框,除非他修复了这些错误,否则不允许用户继续操作。所以,我会说控制器/视图助手是事实上已经完成验证的地方,但你应该在可行的情况下考虑客户端验证。它还可以节省您到服务器的行程。
如果您公开与SOAP / REST相同的功能 答。现在,您可以注释相同的控制器方法,使它们作为Web服务端点工作。因此,您的控制器可以为基于Web的请求以及SOAP / REST请求提供服务。 但需要注意的是 - 你的形状豆/支持豆应该设计得非常好。我见过将hibernate模型对象用作表单支持对象的代码。当你从表单支持对象生成WSDL时,这会很棘手,因为hibernate模型对象可能有许多链接实体,并且最终在请求/响应中有非常复杂的xml结构。 但是,如果您将后端bean设计为细粒度的,即没有复杂的对象,那么您应该放心地使用现有的控制器/控制器方法作为SOAP / REST的Web服务端点。
< / LI>答案 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.