Laravel 5 installation on Ubuntu 14.04
Installation
- Tested on Ubuntu 14.04.2 LTS, Apache/2.4.9, PHP 5.5.15RC1, Laravel (5.0; installer version 1.2.0) / medium / about 30 minutes
Prerequisite environment setup
Make sure you have PHP 5.4 or greater version installed. On a Debian-derived distribution such as Ubuntu, it's as simple as # apt-get install php5
.
Get the git. # apt-get install git
Other basic requirements are mcrypt, mbstring. OpenSSL support is built-in on this version[1]. I also install JSON, xdebug, sqlite, readline, mysql, memcached, intl, and curl.
mhan@brahms:~ $ sudo apt-get install php5-mcrypt php5-json php5-xdebug php5-sqlite php5-readline php5-mysql php5-memcached php5-intl php5-curl
mbstring is a part of libapache2-mod-php5 package[2].
mhan@brahms:~ $ sudo apt-get install libapache2-mod-php5
Files and applications
Download Laravel installer using Composer.
mhan@brahms:~$ composer global require "laravel/installer=~1.1"
Changed current directory to /home/mhan/.composer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing symfony/process (v2.6.4)
Down Downloading: 100%
- Installing symfony/console (v2.6.4)
Down Downloading: 100%
- Installing guzzlehttp/streams (2.1.0)
Down Downloading: 100%
- Installing guzzlehttp/guzzle (4.2.3)
Down Downloading: 100%
- Installing laravel/installer (v1.2.0)
Down Downloading: 100%
symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing psr/log (For using the console logger)
Writing lock file
Generating autoload files
mhan@brahms:~
$ composer global require "laravel/installer=~1.1"
Changed current directory to /home/mhan/.composer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing symfony/process (v2.6.4)
Downloading: 100%
- Installing symfony/console (v2.6.4)
Downloading: 100%
- Installing guzzlehttp/streams (v2.1.0)
Downloading: 100%
- Installing guzzlehttp/guzzle (4.2.3)
Downloading: 100%
- Installing laravel/installer (v1.2.0)
Downloading: 100%
symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing psr/log (For using the console logger)
Writing lock file
Generating autoload files
Instead of adding ~/.composer/vendor/bin to the PATH environment variable, I simply made a symbolic link to it in ~/bin/ folder.
mhan@brahms:/srv/www $ ln -s ~/.composer/vendor/bin/laravel ~/bin/laravel
Create a new Laravel application. For whatever reason the application key doesn't seem to set even though it says so. I had to do this manually later.
mhan@brahms:/srv/www
$ laravel new sanban
Crafting application...
Generating optimized class loader
Compiling common classes
Compiling views
Application key [CJwBsllwDbWLlxy7zH7zRATmSu2laUyA] set successfully.
Application ready! Build something amazing.
Then I enable access to this new application via web. This is an apache config.
<VirtualHost *:80>
ServerAdmin admin@hostname.com
ServerName sanban.hostname.com
ServerSignature Off
DocumentRoot /srv/www/sanban/public
<Directory /srv/www/sanban/public>
Options -Indexes +FollowSymLinks -MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Make sure to restart the httpd (i.e. $ service apache2 restart
on Ubuntu). You should be able to access your website and see the big Laravel 5 text with a quote on the home page.
Post-installation updates
Laravel installation through its own installer may not get the latest version, so execute $ composer update
once from the project home directory. In this example, I'd run it from /srv/www/sanban.
Update app.url, app.timezone[3].
<?php
// config/app.php
..
'url' => 'http://hostname.com',
..
'timezone' => 'America/Denver',
..
It may be just fine to leave the timezone to UTC if you are going to be accommodate for user's particular timezone through some means. If the application isn't going to be serving users from different time zones and you don't plan to scale it then set it to your local one.
Make sure storage is writable by the web server. There are several ways to do this, and one of the ways is to change the ownership so that the web server and you, a developer, can write freely to it.
mhan@brahms:/srv/www/sanban $ sudo chown -R www-data:mhan storage
I also like to add a link to artisan PHP executable into my ~/bin folder.
mhan@brahms:/srv/www/sanban $ chmod u+x artisan.sanban && ln -s /srv/www/sanban/artisan ~/bin/artisan.sanban
I add the application short name as an extension to artisan because I have multiple instances of Laravel applications and create links to corresponding artisan executables.
For unit testing
For compatibility reasons, it's better to use the composer-installed phpunit package. I didn't have enough time to figure out what was wrong, but my pre-installed version of phpunit wasn't working properly. You can do this by running $ composer update --dev
which will install phpunit package automatically. You may also want to create a symlink to it. This example creates a phpunit.sanban symlink which you can use for this particular instance.
mhan@brahms:/srv/www/sanban $ chmod u+x vendor/phpunit/phpunit/phpunit $ ln -s /srv/www/sanban/vendor/phpunit/phpunit/phpunit ~/bin/phpunit.sanban
I also want the unit testing to stop on a failure. You can change stopOnFailure attribute to true in phpunit.xml file.
If you use VIM like I do, you can insert this into your ~/.vimrc file and just hit ,t
(comma and then t) key combination to run the unit test wherever you are under the project directory. This is a bit long because I have some repetitive bash commands to automatically detect the current application name and use that, i.d. "sanban" in this example.
nmap ,t :!if [ -d .git ] \|\| git rev-parse --git-dir > /dev/null 2>&1; then phpunit.$(cat $(git rev-parse --show-toplevel)/phpspec.yml \| grep "namespace" \| awk '{print tolower(substr($0,20));exit}') -c $(git rev-parse --show-toplevel); else phpunit.$(cat $(git rev-parse --show-toplevel)/phpspec.yml \| grep "namespace" \| awk '{print tolower(substr($0,20));exit}'); fi<cr>
In order for this to work properly your project directory has to be initialized as a git repository.
mhan@brahms:/srv/www/sanban
$ git init
Initialized empty Git repository in /srv/www/sanban/.git/
Personal preferences
I browse, search, and many other things all in CLI, and sometimes it's cumbersome to type in long path names. Symlinks to the rescue! I use i
for /vendor/laravel/framework/src/Illuminate.
mhan@brahms:/srv/www/sanban $ ln -s ./vendor/laravel/framework/src/Illuminate i
Configuration
Name the application
I'm naming the application sanban.
mhan@brahms:/srv/www/sanban $ artisan.sanban app:name Sanban
Generate an application key
Check your .env file to make sure you have an encryption key in there. If don't find it there for whatever reason you can generate one with this command.
mhan@brahms:/srv/www/sanban $ artisan.sanban key:generate
References
- ↑ Stack Exchange. Program documentation. Stack Exchange. N.p., n.d. Web. 26 Feb. 2015. <http://askubuntu.com/questions/323005/php-openssl-extension-has-a-package>.
- ↑ Stack Exchange. Program documentation. Stack Exchange. N.p., n.d. Web. 26 Feb. 2015. <http://askubuntu.com/questions/491629/how-to-install-php-mbstring-extension-in-ubuntu>.
- ↑ PHP Manual. Program documentation. PHP Manual. N.p., n.d. Web. 26 Feb 2015. <http://php.net/manual/en/timezones.php>.