对于那些没有';似乎不适合作为CodeIgniter中的模型或库


What to do about those page specific little classes that don't seem to fit as Models or Libraries in CodeIgniter?

在我当前MVC设计模式的实现中(使用PHP和CodeIgniter演示):

假设我在"www.mysite.com/blue/page"上有一个"页面",它最终由以下(大大简化的)文件生成:

/库
 nbsp;session_lib.php
/控制器
 nbsp/红色
 nbsp/白色
 nbsp/蓝色
 nbsp nbsp page.php
/型号
 nbsp/红色
 nbsp/白色
 nbsp/蓝色
 nbsp nbsp funky.class.php
 nbsp nbsp page_model.php
/views
 nbsp/红色
 nbsp/白色
 nbsp/蓝色
 nbsp nbsp page.php

这里有一个易于理解的控制器:

// FILE: /controllers/blue/page.php
// Get some paramaters from URL
$params = $this->input->get();
// Use a library to do some stuff with these params with a session
$this->load->library('session_lib');
$this->session_lib->store_in_session($params);
// Use a very page specific class to do some funky stuff with the params
$this->load->model('blue/funky_class');
$funkified_params = $this->funky_class->funkify($params);
// Pass params to a model
$this->load->model('blue/page_model');
$data['output_from_db'] = $this->page_model->get_some_output_from_db($funkified_params);
// Send to view
$this->load->view('blue/page', $data);

现在的问题是。。。

对于这些不与数据库交互的"时髦"小页面特定类,最好的过程是什么?在这个例子中,我将这个小类与模型一起存储,在某些情况下,可能只是在模型类中添加额外的方法来做一些时髦的事情这种做法好吗或者库和funky类都应该放在模型内部,这样控制器就更瘦了(但是模型可以在其他地方使用,而不需要会话和funky)?

我会使用一个助手。

  • 加载帮助程序时,该函数将在全局范围内可用,因此您可以在任何地方调用它
  • 它们非常适合那些只做一件与模型或库中的代码无关的事情的小型独立函数
  • 在一种或另一种格式之间转换(slugify、convert_timezone、change_query_string)或做一些你不想考虑的小任务(force_ssl、is_image、uri_string)时,帮助者尤其适合我

funkify()似乎是一个合适的辅助函数,可以防止大量重复的代码。

以下是代码点火器文档页面:http://ellislab.com/codeigniter/user-guide/general/helpers.html

如果您所处的情况是,helper函数非常特定,只能在一个地方使用,那么您仍然可以使用helper。以控制器的名称命名帮助程序,例如page_helper.php

page_helper.php

function funkify($params) {
    // do funky stuff
    return $funky_params;
}

然后在您的控制器中:

class Page extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $this->load->helper('page');
    }
    public function page() {
        // do stuff
        $funky_params = funkify($params);
        // do more stuff
        $this->load->view('blue/page', $data);
    }

我没有任何借口,但有时如果我需要一个只在一个位置(比如控制器)使用的剃须刀专用功能,我会把它放在控制器的文件中。您可以在类定义之外粘贴一个函数,它将充当一个辅助对象,并且全局可用(只要加载了该控制器)。也可以在视图内部定义函数。恶心,但有可能。我不喜欢经常这样做,因为这是不寻常的,而且(我自己或其他开发人员)不期望