Лучший способ управлять экземпляром модели - PullRequest
2 голосов
/ 01 декабря 2011

Я работаю над веб-сайтом, и я использовал CodeIgniter в качестве моей платформы, но я все больше разочаровываюсь в том, как они злоупотребляют ООП. Я не фанат ООП, но когда я использую его, я предпочитаю достойную реализацию. Поэтому я решил быстро построить фреймворк PHP. В любом случае, я застрял в обычной для моего приложения архитектуре MVC, но мне было интересно, как можно передать модели контроллерам и библиотекам. Я бы предпочел предоставить экземпляр модели для конструктора контроллера. Что-то в этом роде

class MyController implements IController //whatever
{
    public MyController(IUrlRouteModel url_route_model, IUserModel user_model)
    {
        //usual assignment
    }

    public some_action()
    {
         UserEntity users = user_model->find_all();
    }
}

Я использую PHP, но этот пример / вопрос не связан напрямую с PHP, ответ должен быть следующим. Теперь реальный вопрос в том, где я мог бы управлять экземплярами моделей, где я мог бы их создавать. Я, вероятно, назову контроллер где-нибудь в \ Router, но передавать каждую модель конструктору маршрутизатора было бы странно. Есть ли кто-то, кто может пролить свет на эту тему. Я пытался выяснить, как это делают другие фреймворки, и это то, что у меня есть до сих пор

  1. Они используют ModelKeeper, который функционирует как некий тип фабрики для моделей, мне нравится эта опция, но источник этого класса станет грязным
  2. Модели представлены в статическом контексте. Либо каждый метод модели является статическим, либо они используют какой-то тип одноэлементного шаблона.

Поделитесь своим опытом переполнения стека? Что было бы хорошим способом реализовать это? Или, короче, какое было бы подходящее место для создания экземпляров моделей и как?

PS Я думаю, что модель будет выглядеть примерно так

class UserModel implements IUserModel
{
     public UserModel(DatabaseConnection dbc)
     { /*store for later use*/ }
}

1 Ответ

1 голос
/ 29 февраля 2012

Вы должны передать экземпляр ModelFactory контроллеру, который используется внутри контроллера (ов). Класс ModelFactory в конструкторе должен требовать подключения к БД (скорее всего - экземпляр PDO). Вы создаете его экземпляр на этапе начальной загрузки (возможно, там, где также вызывается ваш \Router), и, если вам нужно что-то подобное, вы можете предоставить фабрике объект, отвечающий за кеширование.

API будет выглядеть примерно так:

namespace Application;

class FooController
{
    protected $factory = null;

    public function __construct( \Framework\ModelFactory $factory )
    {
        $this->factory = $factory;
    }

    public function bar_action( \Framework\Request $request )
    {
        $model = $this->factory->create( 'User' );
        // then pass this model to your view object 
    }
}

Сам завод выглядит примерно так:

namespace Framework;

class ModelFactory
{
    protected $connection = null;    

    public function __construct( \PDO $connection )
    {
       $this->connection = $connection;
    }

    public function create( $name )
    {
        $name = '\\Persistence\\' . $name; 
        // you probably will want configure this in some way

        $model = new $name( $this->connection );
        $model->preconfig(); // .. hell .. maybe you need
        return $model;
    }
}

Ваша фабрика также может просто получить конфигурацию для подключения к БД и инициализировать объект PDO только тогда, когда это требуется в первый раз. Это также может быть лучшим выбором, если вам нужна возможность манипулирования соединением с несколькими базами данных.

P.S. код не был протестирован, он был весь составлен и мог содержать как синтаксический, так и логический fuc сообщения.

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