Что делать с теми маленькими классами, специфичными для страниц, которые не подходят в качестве моделей или библиотек в CodeIgniter?

В моей текущей реализации шаблона проектирования MVC (продемонстрировано с использованием PHP и CodeIgniter):

Допустим, у меня есть "страница", расположенная по адресу "www.mysite.com/blue/page", которая в конечном итоге создается следующими (значительно упрощенными) файлами:

/ библиотеки
session_lib.php
/ контроллеры
/ красный
/ белый
/ синий
page.php
/ модели
/ красный
/ белый
/ синий
funky_class.php
page_model.php
/Просмотры
/ красный
/ белый
/ синий
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);

А теперь вопрос...

Какова наилучшая процедура для этих "классных" маленьких специфичных для страницы классов, которые не взаимодействуют с базой данных? В этом примере я сохраняю маленький класс с моделями, а в некоторых случаях могу просто добавить дополнительные методы внутри класса модели, чтобы сделать что-то интересное. Это хорошая практика? Или библиотека и класс фанки должны входить в модель, чтобы контроллер был еще тоньше (однако модель могла бы использоваться в других местах без необходимости в сессиях и фанки)?

1 ответ

Решение

Я бы использовал помощника.

  • Когда помощник загружен, эта функция будет доступна в глобальной области видимости, поэтому вы можете вызывать ее где угодно.
  • Они отлично подходят для небольших автономных функций, которые выполняют только одну функцию, которая не обязательно связана с кодом в модели или библиотеке
  • Помощники особенно хороши для меня при преобразовании вещей из одного формата в другой (slugify, convert_timezone, change_query_string) или выполнении небольших задач, о которых вы не хотите думать (force_ssl, is_image, uri_string)

funkify () выглядит как подходящая вспомогательная функция, которая может предотвратить многократный повтор кода.

Вот страница документации codeigniter на них: http://ellislab.com/codeigniter/user-guide/general/helpers.html

Если вы находитесь в ситуации, когда вспомогательная функция настолько специфична, что она будет использоваться только в одном месте, вы все равно можете использовать вспомогательную функцию. Назовите помощника в честь вашего контроллера, 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);
    }

У меня нет для этого оправдания, но иногда, если я нахожусь в ситуации, когда мне нужна специфическая для бритвы функция, которая будет использоваться только в одном месте (скажем, в контроллере), я помещу ее прямо в файл контроллера. Вы можете вставить функцию за пределы определения класса, и она будет действовать как помощник и быть доступной глобально (пока загружен этот контроллер). Вы также можете определить функции внутри представления. Гадко, но возможно. Я не люблю делать это часто, потому что это необычно и не ожидается (я или другие разработчики)

Другие вопросы по тегам