Должны ли объекты в ORM содержать операции, отличные от CRUD? - PullRequest
3 голосов
/ 17 ноября 2011

Допустим, у меня есть объект User для выполнения операций CRUD с использованием ORM:

//Create a new User
$user = new User();
$user->name = "John Smith";
$user->age = 30;
$user->email = 'john@smith.com;
$user->save();

Аналогичные операции также будут доступны для Read, Update и Delete.

Но как насчет таких случаев:

  • deleteAllUsers() //delete all users
  • getAllUsers() //get all users
  • promoteUser() //change the user's 'rank' (not permissions) within a website
  • addReputationPoints() //give the user x amount of reputation points

Будут ли операции такого типа переходить в класс User?Если нет, куда они должны идти?Должен ли я иметь класс с именем UserManager, который занимается этими операциями?

Ответы [ 3 ]

1 голос
/ 17 ноября 2011

Обычно класс User расширяет класс ORM, который обеспечивает стандартный интерфейс CRUD.Дополнительные функции, о которых вы говорите, очень хорошо вписываются в сам класс User.

Хорошей практикой всегда является создание «жирных моделей» и тощих контроллеров, то есть размещение всей логики, непосредственно связанной с манипулированием данными в моделях, и только «всеобъемлющей» логики в контроллерах.

См., Например, здесь для получения дополнительной информации http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model

0 голосов
/ 17 ноября 2011

Это зависит от того, как вы разрабатываете свое решение ORM.

Мой подход заключается в том, чтобы заключать коллективные действия (выполненные с несколькими записями одновременно) в некоторый класс , представляющий, например,. таблица базы данных , в которой хранятся пользователи или те, кто отвечает за основные действия ORM - в зависимости от того, являются ли они специфичными для таблицы.

0 голосов
/ 17 ноября 2011

В моем самом любимом фреймворке (Kohana) у нас есть:

ORM::factory('user')->where(<whatever condition required>)->find_all();

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

...