Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Подключение к базе данных

С базой данных в Laminas работает пакет laminas-db. Его главный объект — адаптер: он хранит подключение и выполняет запросы. Параметры подключения записывают в настройки, а адаптер создаётся сам и доступен в контейнере сервисов.

Установка

composer require laminas/laminas-db

Установщик компонентов спросит, в какой файл вписать модуль Laminas\Db. Выберите config/modules.config.php — в списке модулей появится новая строка.

Параметры подключения

Общие параметры пишут в config/autoload/global.php:

// config/autoload/global.php
return [
    'db' => [
        'driver' => 'Pdo_Mysql',
        'hostname' => 'localhost',
        'database' => 'blog',
        'charset' => 'utf8mb4',
    ],
];
КлючЗначение
driverЧерез что подключаться: Pdo_Mysql, Pdo_Pgsql, Pdo_Sqlite
hostnameАдрес сервера базы данных
databaseИмя базы
charsetКодировка соединения

Имя пользователя и пароль — в config/autoload/local.php, который не попадает в репозиторий:

// config/autoload/local.php
return [
    'db' => [
        'username' => 'root',
        'password' => 'secret',
    ],
];

При запуске оба массива сольются в один раздел db.

Таблица статей

Миграций — файлов, описывающих таблицы кодом, — в Laminas нет. Таблицу создают запросом SQL в любой программе для работы с базой (phpMyAdmin, консоль mysql):

CREATE DATABASE blog CHARACTER SET utf8mb4;
 
USE blog;
 
CREATE TABLE posts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    body TEXT NOT NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
 
INSERT INTO posts (title, body) VALUES
    ('Первая статья', 'Текст первой статьи.'),
    ('Вторая статья', 'Текст второй статьи.');

Сохраните этот запрос в проекте, например в файле data/schema.sql, чтобы таблицу можно было создать заново на другом компьютере.

Адаптер в контейнере

Модуль Laminas\Db регистрирует адаптер под именем Laminas\Db\Adapter\AdapterInterface. Фабрика получает его так:

use Laminas\Db\Adapter\AdapterInterface;
 
$adapter = $container->get(AdapterInterface::class);

Подключение к базе происходит не в этот момент, а при первом запросе.

Первый запрос

Запрос SQL выполняет метод query(). Значения передают отдельно, вторым аргументом, а в запросе на их месте ставят знак вопроса:

$rows = $adapter->query('SELECT id, title FROM posts WHERE id > ?', [0]);
 
foreach ($rows as $row) {
    echo $row['title'];
}

Цикл выведет заголовки обеих статей. В следующем уроке этот код переедет в отдельный класс, а контроллер будет получать уже готовые объекты.

Частая ошибка

Если пакет установлен, а модуль Laminas\Db не попал в config/modules.config.php, контейнер не знает про адаптер и выбрасывает ServiceNotFoundException для Laminas\Db\Adapter\AdapterInterface. Откройте список модулей и добавьте строку 'Laminas\Db' вручную перед своими модулями.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.