Подходящее место для размещения логики в MVC

#model-view-controller #yii

#model-view-controller #yii

Вопрос:

Я пишу веб-приложение mvc с фреймворком yii. У меня есть часть бизнес-логики, и я не уверен, где ее разместить. $usernameid=$model->random_id_gen('5'); это функция, о которой я говорю.

SiteController:

 <!-- snip -->
      public function actionIndex()
       {
         $model = new Users();

         if (isset($_POST['Users'])) {
            //call the active record table model
            $model = new Users();

            //massively assign attributes
            $model->attributes=$_POST['Users'];

            //generate random userid
            $usernameid=$model->random_id_gen('5');


<!-- snip -->
  

Класс активной записи пользователей:

  <!-- snip -->
  public function random_id_gen($length)
    {
        $characters = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
        $max = strlen($characters) - 1;
        $string = '';

        for ($i = 0; $i < $length; $i  ) {
            $string .= $characters[mt_rand(0, $max)];
        }

        return $string;
    }
  

Мой вопрос: Принадлежит ли эта функция генератора идентификаторов модели Active record? Должно ли это быть в контроллере? Должно ли это быть в отдельной модели, поскольку это «бизнес-логика», но имеет мало общего с базами данных?

Я пытаюсь стать лучше в том, чтобы не «раздувать» мои классы MVC. Заранее спасибо, ребята.

ОБНОВЛЕНИЕ Я ищу решение, специфичное для yii. Похоже, вопрос перерос в «куда следует помещать библиотеки в yii», если существует такое соглашение.

Ответ №1:

MVC следует переименовать в MVCL .. то есть Model-View-Controller-Library. Такого рода функции должны быть вынесены в отдельную систему библиотек.

Контроллер должен быть сверху. Он выполняет две основные функции: принимает пользовательский ввод и координирует другие элементы (контроллер / библиотека / представление) для вывода. традиционно контроллер запрашивает данные у модели. Но манипулирование данными (наиболее распространенное) должно выполняться функциями в библиотеке.

Может быть два уровня библиотек, один может быть сложным (на основе объектов), а другой может быть простым (на основе глобальных функций) для наиболее распространенных операций. Что-то вроде удаления тегов ИЛИ подготовки XML-данных, очистки URL и т.д. Библиотеки простых функций могут быть доступны всей системе без какого-либо создания экземпляра конкретного библиотечного объекта.

Имеет смысл?

Комментарии:

1. Спасибо за ответ, Стьюи. Я ищу конкретный ответ для yii. Где yii обрабатывает библиотеки? Я обновлю вопрос.

2. Извините, я не использовал yii .. но все основные фреймворки имеют концепцию библиотек.. у yii это тоже должно быть

3. Опять же, входные данные приветствуются. Спасибо.

4. Возможно, это поможет: yiiframework.com/doc/guide/1.1/en/extension.integration

5. Я бы убрал это редактирование. Это в ядре yii, на которое вы просто ссылаетесь. Вы не пишете для него код. Я ценю детективную работу. Я думаю, что собираюсь просто создать свою собственную модель, которая будет действовать как библиотека всякой всячины.

Ответ №2:

Я использую для размещения библиотек :

  • в расширении (/protected /extensions) для универсальных библиотек
  • в protected/components, если библиотека является общей для проекта
  • в protected/modules/xxx/components для библиотек, специфичных для модуля
  • в каталоге поставщиков, если библиотека огромна, и я не хочу ее версифицировать

Обычно вы импортируете каталог protected/components (Yii::import(‘application.components.*’), чтобы эти библиотеки были доступны по запросу.

У меня это работает нормально.

Ответ №3:

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

Итак, вот куда это должно пойти. (Если вы намеренно не выполняете CCP.)

Комментарии:

1. Согласны ли вы со Стьюи, что ему место в библиотеке?

2. Используете ли вы это пространство имен, помещаете ли его в оболочку статического класса или сохраняете как фактическую функцию, зависит от аспекта повторного использования. Но в целом, да. Что он сказал. Библиотека.

Ответ №4:

Насколько я знаю, и я сам этим пользуюсь, в Yii есть вспомогательная папка, и именно это место я использую для размещения вспомогательных функций, подобных той, о которой вы спрашивали. Я не часто им пользовался, поскольку в yii предусмотрено ооочень много функций, но мне пришлось добавить функцию времени, которая показывала бы время до / назад для события, которая работала как шарм в папке helper, и самое приятное, что Yii точно знал, где искать, когда я использовал Yii :: import … надеюсь, это поможет