Должен ли я полностью разделять модели и ORM в MVC?

Я работаю над приложением MVC на PHP, которое не использует никаких фреймворков. Я использую RedBean для моей ORM, которая реализует шаблон datamapper и работает очень похоже на доктрину .

Что касается этого вопроса , я понимаю, что модель НЕ является объектом ORM. В моем проекте у меня есть следующие сценарии:

  • «Сложные» модели, которым необходимо взаимодействовать с большим количеством таблиц в базе данных:

    • Одна из этих моделей может быть чем-то вроде системы разрешений RBAC. Контроллер должен иметь возможность вызывать что-то вроде $ 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 необходимо будет проверять права доступа.

6
задан Community 23 May 2017 в 10:27
поделиться