Я работаю над приложением MVC на PHP, которое не использует никаких фреймворков. Я использую RedBean для моей ORM, которая реализует шаблон datamapper и работает очень похоже на доктрину .
Что касается этого вопроса , я понимаю, что модель НЕ является объектом ORM. В моем проекте у меня есть следующие сценарии:
«Сложные» модели, которым необходимо взаимодействовать с большим количеством таблиц в базе данных:
$ permission-> isAllowed ($ controller, $ action, $ resource)
, чтобы определить, разрешено ли пользователю выполнять запрошенное действие. Кроме того, он может вызвать $ permission-> getPermissions ()
, чтобы получить список разрешений, которые есть у пользователя. «Простые» модели, в которых модель обычно может быть представлена одной таблицей в базе данных:
Пользователь
. Например, $ user-> changeRank ()
, $ user-> addPoints ()
и так далее. Проблема, с которой я столкнулся сейчас, заключается в том, что, просматривая большую часть документации по различным фреймворкам, я вижу, что в примерах контроллер напрямую взаимодействует с ORM.Например, вот пример контроллера из symfony2 :
public function createAction()
{
$product = new Product();
$product->setName('A Foo Bar');
$product->setPrice('19.99');
$product->setDescription('Lorem ipsum dolor');
$em = $this->getDoctrine()->getEntityManager();
$em->persist($product);
$em->flush();
return new Response('Created product id '.$product->getId());
}
Если ORM НЕ является моделью, почему контроллеру разрешено взаимодействовать с ним напрямую? Разве он не должен взаимодействовать с моделью, которая выглядит так?
class ProductModel{
public function newProduct($name, $price, $description){
$product = new Product();
$product->setName('A Foo Bar');
$product->setPrice('19.99');
$product->setDescription('Lorem ipsum dolor');
$em = $this->getDoctrine()->getEntityManager();
$em->persist($product);
$em->flush();
}
}
Наконец, я описал модель разрешений
ранее. Считается ли это моделью в контексте MVC? Этот класс будет использоваться во всем приложении, так как большинству abctions необходимо будет проверять права доступа.