Setting Up A Laravel Local Dev Environment On Ubuntu 🐘🐧
Tags: laravel, php, tutorial
Published: 2019-08-18 22:26:25

Let's get a simple Laravel dev environment running on Ubuntu desktop 19.04 & 18.04 including a complete MySQL database connection.

This article assumes some familiarity with the Linux terminal.

# Install PHP 

Add and install the PHP 7.3 PPA

```
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php7.3
```

Verify the PHP version installed
```
php -v
```

Output:
```
PHP 7.3.8-1+ubuntu19.04.1+deb.sury.org+1 (cli) (built: Aug  7 2019 09:52:53) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.8, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.8-1+ubuntu19.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
```

# Install MySQL database
```
sudo apt-get install php7.3-mysql
sudo apt-get install mysql-server
sudo mysql_secure_installation
```

Now you'll be presented with some prompts. 

For a local dev environment I skip the 'Validate Password Plugin'.

You will be asked to enter a password for the `root` user.

From there remove the anonymous users, disallow the `root` user from remote access, and remove the test database.

When asked to reload privilege tables select `yes`.

## Create a non-root user with root privilages

We will use this user when configuring our Laravel application later on.

Log into MySQL as `root`.
```
sudo mysql -u root -p
```
Run the following SQL to create a new user `admin`.
```sql
CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
```
Enter `exit` to leave the MySQL CLI.
```
mysql> exit
```

Test out the new user by logging in as `admin` without using `sudo`.

```
mysql -u admin
```

You should see something like:
```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.7.27-0ubuntu0.19.04.1 (Ubuntu)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> _
```

Exit MySql and we'll move on to installing Composer.
```
mysql> exit
```

# Install Composer

First, we need to update our package manager.
```
sudo apt update
```

Now we are going to install some dependencies needed for the Composer installation.
- `curl` for downloading Composer
- `php-cli` is needed to run the install
- `php-mbstring` provides functions for a library used
- `git` will allow Composer to download project dependencies
- `unzip` for unzipping packages

```
sudo apt install curl php-cli php-mbstring git unzip
```

With that out of the way we can download the Composer installer.

Begin by moving into your home directory
```
cd ~
```

and starting the Composer installer download.
```
curl -sS https://getcomposer.org/installer -o composer-setup.php
```

Before we can run the installer it needs to be verified for corruption.

Visit [https://composer.github.io/pubkeys.html](https://composer.github.io/pubkeys.html) and find the '**Installer Signature (SHA-384)**'

Use the signature and run the following commands to verify your installer.
```
HASH=your_hash_goes_here
```
```
php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
```

You should see the output of
```
Installer verified
```

otherwise you will need to re-download the installer and go through the verification steps again.

## Run the installer

Now we are free to install Composer globally on the system.
```
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
```

Output:
```
All settings correct for using Composer
Downloading...

Composer (version 1.9.0) successfully installed to: /usr/local/bin/composer
Use it: php /usr/local/bin/composer
```

Lastly we need to update permissions to the composer directory.

```
sudo chown -R $USER ~/.composer/
```

### Verify Composer is installed

⚠️ Do not run composer as root using sudo ⚠️

Simply run
```
composer
```

and you should see:
```
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.9.0 2019-08-02 20:55:32
```

# Time for Laravel!

But first, some dependencies.
```
sudo apt-get install php7.3-zip
```
```
sudo apt-get install php7.3-xml
```
Download the Laravel installer using Composer.

```
composer global require laravel/installer
```

Now we need to update the Linux `$PATH` 
```
echo 'export PATH="$PATH:$HOME/.composer/vendor/bin"' >> ~/.bashrc
```

After updating the `$PATH` close your terminal window and open a fresh one.

# Hello, World

Let's get a boilerplate Laravel app running on our localhost.

First we will need to create the database that we will be connecting to.

Log into MySql via the terminal using the `admin` user that was created earlier.

```
mysql -u admin
```

Now run the following SQL to create a database named `laravel`.


```
CREATE DATABASE laravel;
```

With our database created we can move to the Laravel side of things.

`cd` via the terminal into the folder you want to create your Laravel application in.

For me that's `~/dev/laravel/`

Run the following command to scaffold the app:
```
laravel new hello-world
```

`hello-world` is just the name of the app so name it whatever you like.

Once this finishes `cd` into the new directory for your app.

```
cd hello-world
```

At this point we need to tell the Laravel app how to connect to our database.

For this we will edit the `.env` file in the root of the application.

```
sudo nano .env
```

The connection settings should look like this
```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=admin
DB_PASSWORD=
```
You can save the changes from nano with `ctrl+x`-> `'y'` -> `[ENTER]`

Now we need to test this connection.

For this we will edit `/routes/web.php`

It should end up looking like

```php
Route::get('/', function () {
    // return view('welcome');
    try {
        DB::connection()->getPdo();
        $caught = false;
    } catch (Exception $e) {
        $caught = true;
        die("Could not connect to the database.  Please check your configuration. error:" . $e );
    }

    if(!$caught){
        echo 'Hello, world.';
    }
});
```
Now start the server by running
```
php artisan serve
```

Output:
```
Laravel development server started: <http://127.0.0.1:8000>
```

Now you can check it out in your browser at [http://127.0.0.1:8000](http://127.0.0.1:8000)

You should see 'Hello, world.' printed to the screen signalling a successful connection to the database.

That's it! 🎉

You now have PHP 7.3, MySql, Composer, and the Laravel installer configured for your local Ubuntu development environment with a running starter Laravel app.

----

I'm Andrew, a full stack software developer from the deep south who makes internet things.

Hit me up on twitter [@andrew_brooksie](http://www.twitter.com/andrew_brooksie)

Reach out if you have any questions or requests for future write-ups!