Подключение к базе данных
С базой данных в 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' вручную перед своими модулями.