флейм из "помогите освоить МVС"

mustafa007

Новичок
и вроде работает но понадобилось мне в использовать две разные модели
"Корзина" и "Товары"

и тут я обноружил что в таком случаии подключение к базе происходит повторно; подскажите пожулусто как правильно предать в модели обект для работы с БД
PHP:
class Model
{
     protected $db;
     public function __construct()
     {
          if(!$this->db)
          $this->db = new MysqliDb (DB_HOST, DB_USER, DB_PASS, DB_NAME);
     }
}
И никакого антипаттерна в виде singleton
 

mustafa007

Новичок
Первое сообщение на форуме - и такой фейл…
Все норм. Человек только учится, а вы тут и синглетоны, и реестры, и фреймворки пихаете. Сначала пусть так попробует. Потом поймет, что это не совсем удобно, и нужно использовать DI. В процессе познавания пока шишек не набьешь не поймешь зачем придуманы паттерны, когда можно процедуркой обойтись.
Вот как теперь объяснить, что эта куча кода (которая сейчас очень урезана) удобна в использовании. Посмотрите в гугле запросы "зачем нужны интерфейсы", "зачем нужны абстрактные классы" их задают новички, т.к. не понимают их назначения. И понимание приходит только с опытом.

PHP:
/**
*  Интерфейс который должны реализовать адаптеры
*/
interface IAdapter
{
    public function fetchOne($search);
    public function fetchAll($search);
    public function save(array $data);
    public function delete(array $data);
}

/**
*  Адаптер для работы с БД реализующий интерфейс
*/
class DBAdapter implements IAdapter
{
    public function fetchOne($search)
    {
         // TODO
    }

    public function fetchAll($search);
    {
         // TODO
    }

    public function save(array $data);
    {
         // TODO
    }

    public function delete(array $data);
    {
         // TODO
    }

}

/**
*  Адаптер для работы с файлами реализующий интерфейс
*/
class FileAdapter implements IAdapter
{
    public function fetchOne($search)
    {
         // TODO
    }

    public function fetchAll($search);
    {
         // TODO
    }

    public function save(array $data);
    {
         // TODO
    }

    public function delete(array $data);
    {
         // TODO
    }

}

/**
*  Абстрактная модель, которая требует адаптер реализующий интерфейс
*/
abstract class AbstractModel
{
    protected $adapter;
        public function __construct(IAdapter $adapter)
        {             
              $this->adapter = $adapter;
        }

        public function getAdapter()
        {
              return $this->adapter;
        }
}

/**
*  Абстрактная модель, расширяющая базовую модель и передающая в неё адаптер для работы с БД
*/
abstract class DBModel extend AbstractModel
{
        public function __construct()
        {
              $adapter = (!$this->adapter) ? new DBAdapter() : $this->adapter;
              parent::__construct($adapter);              
        }
}

/**
*  Абстрактная модель, расширяющая базовую модель и передающая в неё адаптер для работы с файлами
*/
abstract class FileModel extend AbstractModel
{
        public function __construct()
        {
              $adapter = (!$this->adapter) ? new FileAdapter() : $this->adapter;
              parent::__construct($adapter);       
        }
}

/**
*  Реальная модель работающая с БД
*/
class RealDBModel extend DBModel
{

}

/**
*  Реальная модель работающая с файлами
*/
class RealFileModel extend FileModel
{

}
 
Последнее редактирование:

Вурдалак

Продвинутый новичок
@mustafa007, человек изначально имел проблему с тем, что соединение создается каждый раз заново в разных объектах. Твой код эту проблему не решает.
 

mustafa007

Новичок
@mustafa007, человек изначально имел проблему с тем, что соединение создается каждый раз заново в разных объектах. Твой код эту проблему не решает.
Проявляем фантазию :)
Если хардкодить, то подключение можно выполнить в адаптере, но тогда нарушим SOLID, и код будет не универсальным. Чтобы этого не делать, передаем подключение с помощью DI, тогда мы сможем сделать несколько абстрактных классов DBModel для разных типов подключений.
Делая так, Ваш код будет универсальным!

PHP:
/**
* Абстрактная модель, расширяющая базовую модель и передающая в неё адаптер для работы с БД
*/
abstract class LocalDBModel extend AbstractModel
{
    public function __construct()
   {
    if(!$this->adapter){
          $config = include 'local_db.config.php';
          $pdo = new PDO($config['dsn'], $config['login'], $config['password'], $config['option']);
          $adapter = new DBAdapter($pdo);
    }   
    parent::__construct($adapter);
   }
}

abstract class RemoteDBModel extend AbstractModel
{
    public function __construct()
   {
    if(!$this->adapter){
          $config = include 'remote_db.config.php';
          $pdo = new PDO($config['dsn'], $config['login'], $config['password'], $config['option']);
          $adapter = new DBAdapter($pdo);
    }   
    parent::__construct($adapter);
   }
}
Когда программист только начинает свой путь, он этих приемов не понимает, это приходит с опытом. Ведь не каждый знает уравнение Шрёдингера приходя в первый класс :) Поэтому для начал проще сделать так, как указал в первом посте.
И если порассуждать есть два типа прогеров, одни программисты другие кодеры. Первые архитекторы, вторые строители. Первые ищут наиболее оптимальные пути решения задач, создают что-то новое. Вторые получив однажды в руки инструмент, проявляют нетерпимость к чему-то новому.
Да, с появлением фреймворков множество задач было упрощено, код стал чище, стабильнее. Но для новичков я бы не советовал использовать фреймворки в начале пути, т.к. из потенциального программиста новичок становится кодером.
Так же бесполезно рассказывать о шаблонах проектирования, т.к. на примере будет выглядеть все гадко и понятно. Но если встанет вопрос о применении того или иного шаблона в реальном проекте, как то, что было ясно и понятно, погружается в туман.
Нужно учится с азов, и даже хардкодить, со временем будет приходить осознание того, в каком месте и какой паттерн использовать.
 

AmdY

Пью пиво
Команда форума
Вот так почти всегда, как только оппонент начинает оперировать терминами SOLID или DDD, то код можно переносить в ЮМОР.
 

fixxxer

К.О.
Партнер клуба
Ну вот чего-то понаписал, а все равно new adapter будет каждый раз )
 

Вурдалак

Продвинутый новичок
@mustafa007, чувак, посмотри внимательно на свой код, ты не решил единственную проблему автора и добавил новых.
 

mustafa007

Новичок
Раз уж рассуждения о том, хорошее видео или нет в основной ветке лучше, чем предложение решений, и посты перенесены во флейм, отвечу всем.

Вот так почти всегда, как только оппонент начинает оперировать терминами SOLID или DDD, то код можно переносить в ЮМОР.
Мдя уж... Ржака! :)
Покажите свои реальные работы, посмотрим на Ваше кун-фу SOLID, поржём вместе. :D

Ну вот чего-то понаписал, а все равно new adapter будет каждый раз )
PHP:
if(!$adapter)
$adapter = new Adapter()
Не???

@mustafa007, чувак, посмотри внимательно на свой код, ты не решил единственную проблему автора и добавил новых.
Каких? Укажите появившиеся проблемы, подумаем проблемы ли, и если да, то найдем решение.
 

fixxxer

К.О.
Партнер клуба

Redjik

Джедай-мастер
а почему не в юморе то?
похохотал =)

@mustafa007, кстати, любимый торололо вопрос на этом форуме, в чем отличие абстрактного класса и интерфейса? причем не в PHP, а вообще? подкинь еще в топку =)
 

Adelf

Administrator
Команда форума
Перенес. Но становится не до юмора, когда такие вот, набравшись много умных слов, солид, ддд не понимая их значения, загрязняют умы других, а то и получают какие-то высокие позиции, менеджерам то мозги запудрить - раз плюнуть.
 

Redjik

Джедай-мастер
я знаю одного тимлида, который год назад еще витуху тянул ;)
 

Adelf

Administrator
Команда форума
А мне сегодня рассказали про админа, который стал софтварным архитектором. Думал вот... как это и что из этого получится.

У нас в компани тимлиды были чтото вроде помощников менеджеров :)
 

Adelf

Administrator
Команда форума
Да не особо :) Уж точно меньше года. В том то и дело. Завтра еще расспрошу про него.
 

Redjik

Джедай-мастер
Уж не один и тот же ли это чувак? Компания в англии? =)
 

AmdY

Пью пиво
Команда форума
Мдя уж... Ржака! :)
Покажите свои реальные работы, посмотрим на Ваше кун-фу SOLID, поржём вместе. :D
Может и сиськи показать?
Я не являюсь поклонником SOLID, а пропагондирую KISS. У тебя в бред, который на каждый new порождает коннект к базе, заменил бы проверку хотя бы на static::$adapter был бы говнокод, но с которым можно работать. А уж SOLID и вовсе не разрешает коннект тащить в модель, своей первой же буквой S.
 
Сверху