За последние 24 часа нас посетили 53877 программистов и 1652 робота. Сейчас ищут 1115 программистов ...

Где хранить подключение к базе?

Тема в разделе "PHP для новичков", создана пользователем Алекс8, 11 дек 2017.

  1. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    Привет всем)) как то обычно работаю с движками и там уже все сделано.. только следуй его философии и все..
    а если самому делать какой то сайт на чистом пхп без фреймворка и движка следуя принципам ООП и используя естественно MVC.. где лучше хранить подключение к БД и как лучше делать..
    я вижу несколько вариантов

    1. Синглтон и в моделях вызывается подключение типа так Db::query('bla-bla-bla')..
    лично мне не нравится.. хотя вижу многие такой подход используют в своих приложениях..
    2. Реестр - создаем подключение, засовываем в реестр и он там лежит..
    создаем какой то абстрактый класс Model с конструктором.. в котором переменной $this->db назначением значение из реестра.. а потом создаем наши модели User extends Model и вроде как уже сразу есть в любой модели подключение к БД...


    как еще можно и как правильнее что ли?))
    Спасибо))
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.815
    Симпатии:
    1.332
    Адрес:
    Лень
    PHP:
    1. public $base = [
    2.         /* ... */
    3.         'db'        => [ Aero\Supports\Lerma::class ],
    4.     ];
    PHP:
    1. protected function createBaseApp()
    2.     {
    3.         /* ... */
    4.      
    5.         $this -> instance( 'db', $this -> base['db'] );
    6.         /* ... */
    7.     }
    PHP:
    1. Aero::$app -> db::query( [ 'SELECT id, username, status, password FROM %s WHERE id = %d',
    2.    $this -> form -> table,
    3.    $_SESSION['id']
    4. ] ) -> fetch( Aero::$app -> db::FETCH_OBJ );
    --- Добавлено ---
    PHP:
    1. public function __get( $name )
    2.     {
    3.         if ( isset ( $this -> instances[$name] ) )
    4.         {
    5.             return $this -> instances[$name];
    6.         }
    7.        
    8.         throw new Exception( 'Not found component ' . $name );
    9.     }
     
  3. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    привет)) это вроде синглон же?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    См. в сторону ServiceLocator-а и DI-контейнера. @MouseZver как раз предлагает ServiceLocator.
    --- Добавлено ---
    http://php-di.org/ - вот прикольный DI-контейнер
     
    romach и Алекс8 нравится это.
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Я просто кладу в реестр и не парюсь. Для того он и сделан.
     
    Алекс8 нравится это.
  6. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    >> Где хранить подключение к базе?

    Во-первых, - в коде. :)

    А во-вторых, если
    то всё равно, MVC не MVC, синглы не синглы, локаторы не локаторы и т.д.
    Есть объект, например DB, и все остальные объекты его используют тем или иным способом и их не колышит, где DB хранит подключение к БД.
    А для DB есть два способа хранения:
    - где-то глобально (тут самый простой - статика). Используется, если нужно единое подключение на всё время работы скрипта.
    - локально (тут правильный - в свойствах объекта). Используется, если нужно временное подключение на время жизни объекта.
    DB это обычный объект, никакой статики, за исключением пары значений для первого случая.
    Как правило DB создаётся в конструкторе класса-наследника и далее используется подобно $this->db.
    Как-то так...
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.815
    Симпатии:
    1.332
    Адрес:
    Лень
    @Алекс8 привет, нет, синглон совсем по другим корням идет
    --- Добавлено ---
    Не совсем так. В моем примере было описано интерфейс использования некой библиотеки для работы базы данных... а библиотек дохренища. Могу использовать обычную обвертку PDO, могу говнокод safemysql.class.php подключить, или свою реализацию Lerma. Но интерфейс будет единым. И кстати у меня она в статике.
     
    Алекс8 нравится это.
  8. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    1) Интерфейс к понятию объект/класс не относится. Это просто описание требуемой структуры объекта (методов, например).
    2) Если принять, что полностью статический объект есть эквивалент глобальному объекту, по тоже самое - объект.
    Другое дело, что с глобальным объектом будут проблемы, рано или поздно.
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.815
    Симпатии:
    1.332
    Адрес:
    Лень
    хорошо, буду называть это рычагом для юзабельности некого монстра с другого астрала
    --- Добавлено ---
    Мне не известна проблема, просвети неуча
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Почему бы не сократить это определение как-нибудь? Слово "интерфейс" отлично подходит, как мне кажется!
     
  11. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.815
    Симпатии:
    1.332
    Адрес:
    Лень
    @Fell-x27 дело в том что все мы разные, и каждому угодить, как "это" лаконично озвучить.. легче с утра жизнью покончить перебегая зёбру и не заметив тупого водилу в автобусе ( сегодня реал )
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    По этому и придумана единая терминология была. Чтобы у каждый вещи было конкретное название, понятное любому специалисту на любом языке.
     
  13. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.815
    Симпатии:
    1.332
    Адрес:
    Лень
    увы, не просвещаюсь этим для хобби.