Правильное место для логики в MVC - PullRequest
0 голосов
/ 21 апреля 2011

Я пишу веб-приложение 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;
    }

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

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

UPDATE Я ищу конкретное решение yii. Похоже, что вопрос превратился в «куда помещать библиотеки в yii», если существует такое соглашение.

Ответы [ 4 ]

5 голосов
/ 21 апреля 2011

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

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

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

Имеет смысл?

2 голосов
/ 29 апреля 2011

Я использую, чтобы положить библиотеки:

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

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

Это прекрасно работает для меня.

0 голосов
/ 01 июня 2012

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

0 голосов
/ 21 апреля 2011

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

Так что это то, куда она должна идти.(Если вы намеренно не делаете КПК .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...