Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laminas Db Laravel Package

laminas/laminas-db

Laminas\Db is a flexible database abstraction for PHP, providing adapters for major databases, SQL builders, table gateways, result sets, metadata tools, and a profiler to help build portable, testable data access layers.

View on GitHub
Deep Wiki
Context7

Usage in a laminas-mvc Application

The minimal installation for a laminas-mvc based application doesn't include any database features.

When installing the Laminas MVC Skeleton Application

While Composer is installing the MVC Application, you can add the laminas-db package while prompted.

Adding to an existing Laminas MVC Skeleton Application

If the MVC application is already created, then use Composer to add the laminas-db package.

The Abstract Factory

Now that the laminas-db package is installed, the abstract factory Laminas\Db\Adapter\AdapterAbstractServiceFactory is available to be used with the service configuration.

Configuring the adapter

The abstract factory expects the configuration key db in order to create a Laminas\Db\Adapter\Adapter instance.

Working with a Sqlite database

Sqlite is a lightweight option to have the application working with a database.

Here is an example of the configuration array for a sqlite database. Assuming the sqlite file path is data/sample.sqlite, the following configuration will produce the adapter:

return [
    'db' => [
        'driver' => 'Pdo',
        'adapters' => [
            sqliteAdapter::class => [
                'driver' => 'Pdo',
                'dsn' => 'sqlite:data/sample.sqlite',
            ],
        ],
    ],
];

The data/ filepath for the sqlite file is the default data/ directory from the Laminas MVC application.

Working with a MySQL database

Unlike a sqlite database, the MySQL database adapter requires a MySQL server.

Here is an example of a configuration array for a MySQL database.

return [
    'db' => [
        'driver' => 'Pdo',
        'adapters' => [
            mysqlAdapter::class => [
                'driver' => 'Pdo',
                'dsn' => 'mysql:dbname=your_database_name;host=your_mysql_host;charset=utf8',
                'username' => 'your_mysql_username',
                'password' => 'your_mysql_password',
                'driver_options' => [
                    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                ],
            ],
        ],
    ],
];

Working with the adapter

Once you have configured an adapter, as in the above examples, you now have a Laminas\Db\Adapter\Adapter available to your application.

A factory for a class that consumes an adapter can pull the adapter by the name used in configuration. As an example, for the sqlite database configured earlier, we could write the following:

use sqliteAdapter ;

$adapter = $container->get(sqliteAdapter::class) ;

For the MySQL Database configured earlier:

use mysqlAdapter ;

$adapter = $container->get(mysqlAdapter::class) ;

You can read more about the adapter in the adapter chapter of the documentation.

Running with Docker

When working with a MySQL database and when running the application with Docker, some files need to be added or adjusted.

Adding the MySQL extension to the PHP container

Change the Dockerfile to add the PDO MySQL extension to PHP.

FROM php:7.3-apache

RUN apt-get update \
 && apt-get install -y git zlib1g-dev libzip-dev \
 && docker-php-ext-install zip pdo_mysql \
 && a2enmod rewrite \
 && sed -i 's!/var/www/html!/var/www/public!g' /etc/apache2/sites-available/000-default.conf \
 && mv /var/www/html /var/www/public \
 && curl -sS https://getcomposer.org/installer \
  | php -- --install-dir=/usr/local/bin --filename=composer

WORKDIR /var/www

Adding the mysql container

Change the docker-compose.yml file to add a new container for mysql.

  mysql:
    image: mysql
    ports:
     - 3306:3306
    command:
      --default-authentication-plugin=mysql_native_password
    volumes:
     - ./.data/db:/var/lib/mysql
     - ./.docker/mysql/:/docker-entrypoint-initdb.d/
    environment:
     - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}

Though it is not the topic to explain how to write a docker-compose.yml file, a few details need to be highlighted :

  • The name of the container is mysql.
  • MySQL database files will be stored in the directory /.data/db/.
  • SQL schemas will need to be added to the /.docker/mysql/ directory so that Docker will be able to build and populate the database(s).
  • The mysql docker image is using the $MYSQL_ROOT_PASSWORD environment variable to set the mysql root password.

Link the containers

Now link the mysql container and the laminas container so that the application knows where to find the mysql server.

  laminas:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
     - 8080:80
    volumes:
     - .:/var/www
    links:
     - mysql:mysql

Adding phpMyAdmin

Optionnally, you can also add a container for phpMyAdmin.

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
     - 8081:80
    environment:
     - PMA_HOST=${PMA_HOST}

The image uses the $PMA_HOST environment variable to set the host of the mysql server. The expected value is the name of the mysql container.

Putting everything together:

version: "2.1"
services:
  laminas:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
     - 8080:80
    volumes:
     - .:/var/www
    links:
     - mysql:mysql
  mysql:
    image: mysql
    ports:
     - 3306:3306
    command:
      --default-authentication-plugin=mysql_native_password
    volumes:
     - ./.data/db:/var/lib/mysql
     - ./.docker/mysql/:/docker-entrypoint-initdb.d/
    environment:
     - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
     - 8081:80
    environment:
     - PMA_HOST=${PMA_HOST}

Defining credentials

The docker-compose.yml file uses ENV variables to define the credentials.

Docker will read the ENV variables from a .env file.

MYSQL_ROOT_PASSWORD=rootpassword
PMA_HOST=mysql

Initiating the database schemas

At build, if the /.data/db directory is missing, Docker will create the mysql database with any .sql files found in the .docker/mysql/ directory. (These are the files with the CREATE DATABASE, USE (database), and CREATE TABLE, INSERT INTO directives defined earlier in this document). If multiple .sql files are present, it is a good idea to safely order the list because Docker will read the files in ascending order.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport
twbs/bootstrap4