oliverdavies.uk/source/_posts/running-drupal-with-symfony-local-server.md

5.5 KiB
Raw Blame History

title excerpt date tags draft
Running Drupal 8.8 with the Symfony Local Server Running Drupal 8.8 with the Symfony Local Server ~
drupal
drupal-8
symfony
true

A screenshot of a terminal window running a Drupal project with the Symfony local server

Installation

https://symfony.com/doc/current/setup/symfony_server.html

The Symfony server is bundled as part of the symfony binary that is available to download from https://symfony.com/download.

To install it, run this command:

curl -sS https://get.symfony.com/cli/installer | bash

Even though its by Symfony, the local webserver works with any type of project - including Drupal 8 and Drupal 7.

Getting started

# Alias for server:start, starts the server
symfony serve

# Run the server in daemon mode (in the background)
symfony serve -d

# Display the status of the server
symfony server:status

# Stop the server
symfony server:stop

web and docroot directories are automatically used as the document root for the server, so files are served from there if you run the serve command within the projects root directory.

Different PHP Versions

One of the most useful features of the Symfony server is that it supports multiple versions of PHP if you have them installed, and a different version can be selected per directory.

This is done by adding a .php-version file to the root of the project that contains the PHP version to use. For example:

echo "7.3" > .php-version

Next time the server is started, this file will be read and the correct version of PHP will be used.

If youre using macOS and want to install another version of PHP, you can do it using Homebrew:

# Install PHP 7.3
brew install php@7.3

Further PHP customisations can be made per project by adding a php.ini file.

Securing Sites Locally

The Symfony server allows for serving sites via HTTPS by installing its own local certificate authority.

If its not installed automatically, run this command to install it:

symfony server:ca:install

Now any site will be served via HTTPS by default, and any HTTP requests will be automatically redirected to HTTPS.

If you need to run a site with just HTTP, add the --no-tls option to the serve command.

Adding Databases with Docker

The Symfony server has an integration with Docker for providing extra services - such as databases that well need for Drupal.

This is my docker-compose.yaml file which defines a database service for MySQL:

version: '2.1'

services:
  database:
    image: mysql:5.7
    ports: [3306]
    environment:
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

Because port 3306 is exposed, the server recognises it as a database service and automatically creates environment variables prefixed with DATABASE_.

A list of all the environment variables can be seen by running symfony var:export (add | tr " " "\n" if you want to view each one on a new line, and | sort if you want to list them alphabetically):

DATABASE_DATABASE=main
DATABASE_DRIVER=mysql
DATABASE_HOST=127.0.0.1
DATABASE_NAME=main
DATABASE_PASSWORD=secret
DATABASE_PORT=32776
DATABASE_SERVER=mysql://127.0.0.1:32776
DATABASE_URL=mysql://root:secret@127.0.0.1:32776/main?sslmode=disable&charset=utf8mb4
DATABASE_USER=root
DATABASE_USERNAME=root
SYMFONY_DOCKER_ENV=1
SYMFONY_TUNNEL=
SYMFONY_TUNNEL_ENV=

Now I can use these environment variables within my settings.php file to allow Drupal to connect to the database service.

// web/sites/default/settings.php

if ($_SERVER['SYMFONY_DOCKER_ENV']) {
  $databases['default']['default'] = [
    'driver' => $_SERVER['DATABASE_DRIVER'],
    'host' => $_SERVER['DATABASE_HOST'],
    'database' => $_SERVER['DATABASE_NAME'],
    'username' => $_SERVER['DATABASE_USER'],
    'password' => $_SERVER['DATABASE_PASSWORD'],
    'port' => $_SERVER['DATABASE_PORT'],
    'prefix' => '',
    'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
    'collation' => 'utf8mb4_general_ci',
  ];
}

Installing Drupal

Drush is added as a dependency via Composer.

../vendor/bin/drush site-install

However, this will cause an error like this because Drupal cannot connect to the database.

Error: Class 'Drush\Sql\Sql' not found in Drush\Sql\SqlBase::getInstance()

To fix this, ensure that the command is prefixed with symfony php. This will ensure that the correct PHP version and configuration is used, and that the appropriate environment variables are available.

symfony php ../vendor/bin/drush site-install

This also applies to all other Drush commands.

Custom Domain Names

Good for multisites.

https://symfony.com/doc/current/setup/symfony_server.html#local-domain-names

TODO: add proxy image

cp web/sites/default web/sites/umami

symfony proxy:domain:attach umami

The proxy is now configured with the following domains for this directory:

// web/sites/sites.php

$sites['umami.wip'] = 'umami';

labels:

labels:
  com.symfony.server.service-prefix: 'DATABASE_UMAMI'

symfony-server-drupal-test_database_1 symfony-server-drupal-test_database_umami_1

symfony php ../vendor/bin/drush si demo_umami \
  -l umami \
  --no-interaction