Installing Laravel 5 on Apache in Mac OS X El Capitan

Last time, I wrote a guide on How to install Laravel 5 in Windows with XAMPP. I’ve been coding more often on Mac computers recently, and now I need to setup Laravel on a MacBook Pro, so I decided I’ll write a guide on how to install Laravel 5 on Mac OS X El Capitan too. πŸ™‚

First, I’ll assume you already have a local development environment set up on your Mac.

Environment Requirements

This guide won’t cover setting up Laravel on Homestead, so let’s make sure our development environment meets the following requirements:

 

  • PHP >= 5.6.4
  • OpenSSL PHP Extension
  • PDO PHP Extension
  • Mbstring PHP Extension
  • Tokenizer PHP Extension

Install Composer

See the instructions on the Composer download page on how to install composer.

After installing, you shall get a file composer.phar in the directory where you ran the installation commands for Composer.

Make ‘composer’ executable from anywhere

Right now, if you want to run Composer, you will have to navigate to the folder where you stored composer.phar and run a command like php /usr/local/bin/composer.phar. Let’s make our lives easier by creating an alias, an be able to run Composer simply by typing the composer command. πŸ˜‰

Let’s move composer.phar to the path /usr/local/bin by running this command:

And to finally create the alias, type this command to edit bash_profile:

Add the following line to your bash_profile:

Restart terminal or open a new terminal tab. Type composer and this should be able to run Composer.

Download Laravel via Composer

Navigate to your document root, (mine is at /webcontent) and run the following command to download and install Laravel into a folder named “laravel5”. Change the folder name as you like.

Now, I will assume that you have your Laravel at this path: /webcontent/laravel5/

Verify folder permissions

Update (2016-10-20): I formed the habit of setting permissions of all my bootstrap/cache/* and storage/* directories to 775 (not 755), which means the owner and group members are granted all rights (read, write, execute). 755 will only grant write access to user, and not group members. The owner of all my Laravel files is my own user (e.g., catzie) and the group owner is _www. My own user and the user called _www are both members of the group _www. Permissions on bootstrap/cache and storage/* is drwxrwxr-x

The contents of the following directories are required to be writable, otherwise, Laravel will not run:

  • storage
  • bootstrap/cache

Before I set the directories as writable, when I access my Laravel at http://localhost/laravel5/public, I only get an “Error 500” without any detail. Then after setting proper permissions, my Laravel became accessible.

We are going to set the permission into 755. Some information about 755:

Tip: you don’t want to set these folders to 777 because you will make attackers happy when they find out they can write to your files/folders! We want to keep attackers unhappy. πŸ˜€

Set permissions on storage folder

Let’s navigate to /storage then set the permission of /storage contents to 755 through these commands:

By the way, the -R in the chmod command affects files and directories recursively. It is equivalent to --recursive. The asterisk * lets the chmod apply the change to all contents of present directory /storage.

Set permissions on bootstrap/cache folder

After setting 755 as permission on bootstrap/cache, I still had an error, saying file_put_contents(/webcontent/laravel5/bootstrap/cache/services.php): failed to open stream: Permission denied

To pass the issue, I ran these commands:

I don’t know why, but setting it to 755 doesn’t work. When I first set to 777, then reset to 755 though, it works!

Okay, now I get a different error: file_put_contents(/webcontent/laravel5/storage/framework/views/<someHashedString>.php): failed to open stream: Permission denied

It seems that my /views folder is not writable. But hey, I already set permissions recursively for contents of storage folder! πŸ™

I decided to try the trick I did earlier with bootstrap/cache, which is first setting to 777 then resetting it into 755:

First, I set it to 777 then viewed Laravel in my browser. It finally loaded the Laravel home screen. But no, I don’t want to leave the folders under /webcontent/laravel5/storage/ with permission 777 because it can be a security risk. So, I set it back to 755:

I refreshed my browser and Laravel is still running. Whoohoo! Finally!

If any of you has an idea why setting to 777 then resetting to 755 works, please let me know through the comments area. πŸ˜†

Update: I realized the right thing to do is chmod all directories under storage with 775 to enable group members to write too. And then, chown the folders from “catzie” to “_www”. Since _www is the user who always needs to write to those folders, just let him own them. :p And here I am hoping that I don’t encounter problems when it’s user “catzie” who’s trying to access those folders and their files.

Update again: My directories and files are owned by group “staff” but only user “catzie” is member of the group called “staff”. This can be checked by the command id -Gn _www and id -Gn catzie. To add user “_www” to the group staff, I will run the following command:

This -a(dds) β€œ_www”, which is an object of -t(ype) β€œuser”, to the group β€œstaff”.source

Create your first Laravel route

Now that we are able to load the home/welcome page of Laravel, let’s proceed and create a new route.

With your favorite text editor, open app/Http/routes.php and add the following code:

When I visited the URL http://localhost/laravel5/public/ohayou, I got this error:

When I changed AllowOverride None into AllowOverride All in Apache config file /etc/apache2/httpd.conf, all it did was show me the error file_put_contents(/webcontent/laravel5/bootstrap/cache/services.php): failed to open stream: Permission denied again when accessing http://localhost/laravel5/public/ohayou and even the home page.

y-u-no

Y U BRING BACK SAME PROBLEM?!

Despite being potential security risk, this fixed my problem and allowed me to access the URL http://localhost/laravel5/public/ohayou:

Err, then I tried to set it back to 755 again…

And yep, still works! I hope this always works from now on. @_@ lalala~

Test Laravel with MySQL database

For us to be ready to develop a web app with Laravel, let’s test one last thing: the connection to database. In this section, we’ll use Artisan to run “migrations”.

Artisan is the command line interface that’s included in Laravel. And when we run migrations, tables are created based on schemas defined in the migrations in the directory /webcontent/laravel5/database/migrations.

Create database

I’ll be using Terminal to check MySQL. If you prefer PhpMyAdmin, that’s okay.

Create a database named “laravel5”:

Then select that database:

You’ll see that there are no tables yet, since we only just created the database without adding any table:

Change database settings on .env file

When I finished installing Laravel, a .env file was generated for me. In case your installation only has a .env.example file, copy that into a new file that’s named .env

Now that you have a .env file, go ahead and edit it and fill in the correct values for your database connection. Do change the value of the following:

Run migration

Laravel’s pre-made migration files will create tables for us, such as the “users” table.

Run this so that the migrations create database tables:

Oops, I got an error again: PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'The stream or file "/webcontent/laravel5/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied' in /webcontent/laravel5/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:107

Ohhh, I checked the details about the file laravel.log located at /webcontent/laravel5/storage/logs and this is what I found:

I believe that laravel.log is generated by Laravel… which means that the user laravel uses is _www and not MY user. But we are at the same “group”. Maybe the right thing to do is simply add “write” permission to “group”.

Lemme try that with this command…

And now, this is what my laravel.log looks like:

Whoa, it worked! retried my php artisan migrate and the command ran successfully. πŸ˜€

Check if tables are created

Back to the MySQL command line, I’m running these commands to check if tables have been created:

There you have it! Laravel can connect to your MySQL database. πŸ™‚

Command reference:

To create new user and grant it all privileges to an existing database, use this:

Possible hiccups and solutions/workaround

No supported encrypter found when running php artisan route:list

When I run the command php artisan route:list to get a list of my Laravel routes, I got the error:

To fix this, make sure you have a .env file in your Laravel root directory. If you don’t, copy and rename from .env.example then edit the values as needed.

Then, run this on your Terminal: php artisan key:generate which should generate and save a key on your .env file.

If that still doesn’t work, maybe it has something to do with the cipher you are using. Edit config/app.php and set the value of cipher to 'AES-256-CBC' so that you have 'cipher' => 'AES-256-CBC',

Now try to run php artisan route:list again.

Explanation:

For Laravel 5.1, if the .env file does not exist, duplicate the .env.example file, rename it to .env, then run php artisan key:generate (as opposed to hardcoding a default in the config/app.php file).
The artisan command should update the APP_KEY in the .env file with a 32 character string to match the length expected by the ‘cipher’ => ‘AES-256-CBC’ (in the config/app.php file).
Source: No supported encrypter found. The cipher and / or key length are invalid.

PDOException when running php artisan migrate

I wanted to run php artisan migrate in Laravel to generate by database tables but I was getting this error:

What fixed this issue for me was changing DB_HOST value in .env from ‘localhost’ to ‘127.0.0.1’. This is a known issue in my Mac. I need to use 127.0.0.1 in web app settings to use the database. Hope I find time to fix it πŸ˜†

Reference(s):
Add a user to the admin group via command line
Setting folders as writable in Unix systems
Installing Composer on OS X
CHMOD settings
Making some Laravel folders writable

Catzie

A Filipino who is a mobile & web developer on weekdays, and a baker on weekends. When I have time to spare, I blog, play video games, watch series (usually anime), cook dishes, draw, or spend a little time with pets. I also like traveling and recording song covers, but I only do so occasionally. Follow on Twitter: @catzie

4 comments on “Installing Laravel 5 on Apache in Mac OS X El Capitan

 

Leave a Reply

Your email address will not be published. Required fields are marked *