diff --git a/source/_partials/figure.html.twig b/source/_partials/figure.html.twig
index e162afee..c8de55c1 100644
--- a/source/_partials/figure.html.twig
+++ b/source/_partials/figure.html.twig
@@ -1,7 +1,7 @@
{% if caption %}
-
+
{{ caption }}
{% endif %}
diff --git a/source/_posts/running-drupal-with-symfony-local-server.md b/source/_posts/running-drupal-with-symfony-local-server.md
index a44fe1d7..40efded4 100644
--- a/source/_posts/running-drupal-with-symfony-local-server.md
+++ b/source/_posts/running-drupal-with-symfony-local-server.md
@@ -1,19 +1,25 @@
---
title: Running Drupal 8.8 with the Symfony Local Server
excerpt: Running Drupal 8.8 with the Symfony Local Server
-date: ~
+date: 2020-03-09
tags:
- drupal
- drupal-8
- symfony
-draft: true
---

+
+
## 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 .
@@ -25,10 +31,12 @@ curl -sS https://get.symfony.com/cli/installer | bash
```
Even though it’s by Symfony, the local webserver works with any type of
-project - including Drupal 8 and Drupal 7.
+project - including Drupal 8 (and 9) and Drupal 7.
## Getting started
+Here are the basic commands to start and stop the server:
+
```bash
# Alias for server:start, starts the server
symfony serve
@@ -43,9 +51,16 @@ symfony server:status
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 project’s root directory.
+If your Drupal files are within a `web` or `docroot` directory, it will
+automatically be used as the document root for the server, so files are served
+from there if you run the serve command.
+
+If you use a different subdirectory name - one that isn't loaded automatically -
+you can use the `--document-root` option:
+
+```bash
+symfony serve --document-root www
+```
## Different PHP Versions
@@ -77,8 +92,8 @@ 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.
+The Symfony server allows for serving sites via HTTPS locally by installing its
+own local certificate authority.
If it’s not installed automatically, run this command to install it:
@@ -87,15 +102,15 @@ symfony server:ca:install
```
Now any site will be served via HTTPS by default, and any HTTP requests will be
-automatically redirected to HTTPS.
+automatically redirected.
If you need to run a site with just HTTP, add the `--no-tls` option to the
`serve` command.
-## Adding Databases with Docker
+## Adding Databases (and other services) with Docker
The Symfony server has an integration with Docker for providing extra services -
-such as databases that we’ll need for Drupal.
+such as databases that we’ll need to install Drupal.
This is my `docker-compose.yaml` file which defines a `database` service for
MySQL:
@@ -139,13 +154,13 @@ 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.
+Now these environment variables can be used within `settings.php` file to allow
+configure Drupal’s database connection settings:
```php
// web/sites/default/settings.php
-if ($_SERVER['SYMFONY_DOCKER_ENV']) {
+if ($_SERVER['SYMFONY_DEFAULT_ROUTE_URL']) {
$databases['default']['default'] = [
'driver' => $_SERVER['DATABASE_DRIVER'],
'host' => $_SERVER['DATABASE_HOST'],
@@ -160,16 +175,30 @@ if ($_SERVER['SYMFONY_DOCKER_ENV']) {
}
```
+To keep things organised, I usually like to split these settings into their own
+file and include it:
+
+```php
+if ($_SERVER['SYMFONY_DEFAULT_ROUTE_URL'] && file_exists(__DIR__ . '/settings.symfony.php')) {
+ require_once __DIR__ . '/settings.symfony.php';
+}
+```
+
## Installing Drupal
-Drush is added as a dependency via Composer.
+Now that Drupal can connect to the (empty) database, we can install the site. I
+usually do this using Drush, which is added as a dependency via Composer.
+
+The command that I’d usually run is:
```bash
+cd web
+
../vendor/bin/drush site-install
```
However, this will cause an error like this because Drupal cannot connect to the
-database.
+database when Drush is run in this way.
> Error: Class 'Drush\Sql\Sql' not found in Drush\Sql\SqlBase::getInstance()
@@ -185,40 +214,110 @@ This also applies to all other Drush commands.
## Custom Domain Names
-Good for multisites.
+Currently we can only access the site via the localhost URL with a specific
+port. The port is determined automatically when the server is started so it can
+change if you have multiple projects running.
-https://symfony.com/doc/current/setup/symfony_server.html#local-domain-names
+Symfony server also allows for
+[adding local domain names through a proxy](https://symfony.com/doc/current/setup/symfony_server.html#local-domain-names).
+This is useful if you always want to access the site from the same URL, or if
+the site relies on using a specific URL such as a multisite setup (multiple
+domains served from the same codebase).
-TODO: add proxy image
+{% include 'figure' with {
+ image: {
+ src: '/images/blog/running-drupal-with-symfony-local-server/proxy.png',
+ alt: 'A screenshot of the proxy overview screen, showing three local projects with their local domains, ports and directories.',
+ },
+ caption: 'The proxy overview screen'
+} only %}
-```
-cp web/sites/default web/sites/umami
+### Setting up a multisite
+
+Here’s an example of how I would use local domains to configure a multisite
+Drupal installation (taken from
+).
+
+The first thing is to add the subdomain to the proxy. In this example, I’m going
+to set up a version of the Umami demo installation profile at
+`https://umami.wip`.
+
+```bash
+# Add umami.wip to the proxy and attach it to this directory
+symfony proxy:domain:attach umami
```
-`symfony proxy:domain:attach umami`
-
-> The proxy is now configured with the following domains for this directory:
->
-> - http://umami.wip
+Now we can add it to Drupal’s `sites.php` file to route requests to the correct
+site directory:
```php
// web/sites/sites.php
+// This maps https://umami.wip to the sites/umami directory
$sites['umami.wip'] = 'umami';
```
-labels:
+To create the directory, we can duplicate the `default` site directory and its
+contents.
-```yaml
-labels:
- com.symfony.server.service-prefix: 'DATABASE_UMAMI'
+```
+cp -R web/sites/default web/sites/umami
```
-symfony-server-drupal-test_database_1
-symfony-server-drupal-test_database_umami_1
+To create a separate database, we add a new service to the `docker-compose.yaml`
+file and a new MySQL volume to store the data. We can use labels to generate
+site specific environment variables.
+
+```diff
+ version: '2.1'
+
+ services:
+ database:
+ image: mysql:5.7
+ ports: [3306]
+ environment:
+ MYSQL_ROOT_PASSWORD: secret
+ volumes:
+ - mysql-data:/var/lib/mysql
+
++ database_umami:
++ image: mysql:5.7
++ ports: [3306]
++ environment:
++ MYSQL_ROOT_PASSWORD: secret
++ volumes:
++ - mysql-data-umami:/var/lib/mysql
++ labels:
++ com.symfony.server.service-prefix: 'UMAMI_DATABASE'
+
+ volumes:
+ mysql-data:
++ mysql-data-umami:
+```
+
+These can then be added to `sites/umami/settings.php`:
+
+```php
+$databases['default']['default'] = [
+ 'driver' => $_SERVER['UMAMI_DATABASE_DRIVER'],
+ 'host' => $_SERVER['UMAMI_DATABASE_HOST'],
+ 'database' => $_SERVER['UMAMI_DATABASE_NAME'],
+ 'username' => $_SERVER['UMAMI_DATABASE_USER'],
+ 'password' => $_SERVER['UMAMI_DATABASE_PASSWORD'],
+ 'port' => $_SERVER['UMAMI_DATABASE_PORT'],
+ 'prefix' => '',
+ 'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
+ 'collation' => 'utf8mb4_general_ci',
+];
+```
+
+Now that the Umami site is able to connect to its own database, we can install
+Drupal - specifying the installation profile to use and also the site directory
+to target.
```bash
-symfony php ../vendor/bin/drush si demo_umami \
+symfony php ../vendor/bin/drush site-install \
+ demo_umami \
-l umami \
--no-interaction
```
diff --git a/source/images/blog/running-drupal-with-symfony-local-server/proxy.png b/source/images/blog/running-drupal-with-symfony-local-server/proxy.png
new file mode 100644
index 00000000..fe0289ad
Binary files /dev/null and b/source/images/blog/running-drupal-with-symfony-local-server/proxy.png differ