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:
1 |
mv composer.phar /usr/local/bin |
And to finally create the alias, type this command to edit bash_profile
:
1 |
vim ~/.bash_profile |
Add the following line to your bash_profile
:
1 |
alias composer="php /usr/local/bin/composer.phar" |
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.
1 |
composer create-project --prefer-dist laravel/laravel laravel5 |
Now, I will assume that you have your Laravel at this path: /webcontent/laravel5/
Verify folder permissions
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:
1 |
-rwxr-xr-x (755) — The owner has read, write and execute permissions; the group and others can only read and execute. |
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:
1 2 |
cd /webcontent/laravel5/storage sudo chmod -R 755 * |
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:
1 2 3 |
cd /webcontent/laravel5/bootstrap/ sudo chmod -R 777 cache sudo chmod -R 755 cache |
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:
1 2 |
cd /webcontent/laravel5/storage sudo chmod -R 777 * |
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:
1 |
sudo chmod -R 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:
1 |
sudo /usr/sbin/dseditgroup -o edit -a _www -t user staff |
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:
1 2 3 |
Route::get('/ohayou', function () { echo "Yoroshiku onegaishimasu!"; }); |
When I visited the URL http://localhost/laravel5/public/ohayou, I got this error:
1 2 3 |
Not Found The requested URL /laravel5/public/ohayou was not found on this server. |
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 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:
1 2 |
cd /webcontent/laravel5/storage sudo chmod -R 777 * |
Err, then I tried to set it back to 755 again…
1 2 |
cd /webcontent/laravel5/storage sudo chmod -R 755 * |
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”:
1 2 |
mysql> create database laravel5; Query OK, 1 row affected (0.00 sec) |
Then select that database:
1 2 |
mysql> use laravel5; Database changed |
You’ll see that there are no tables yet, since we only just created the database without adding any table:
1 2 |
mysql> show tables; Empty set (0.00 sec) |
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
1 |
cp /webcontent/laravel5/.env.example /webcontent/laravel5/.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:
1 2 3 |
DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret |
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:
1 |
php artisan migrate |
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:
1 |
-rwxr-xr-x 1 _www staff 104874 Sep 12 18:17 laravel.log |
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…
1 2 |
/webcontent/laravel5/storage/logs sudo chmod -R g+w laravel.log |
And now, this is what my laravel.log looks like:
1 |
-rwxrwxr-x 1 _www staff 104874 Sep 12 18:17 laravel.log |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
mysql> show tables; +--------------------+ | Tables_in_laravel5 | +--------------------+ | migrations | | password_resets | | users | +--------------------+ 3 rows in set (0.00 sec) mysql> describe users; +----------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | | NULL | | | email | varchar(255) | NO | UNI | NULL | | | password | varchar(255) | NO | | NULL | | | remember_token | varchar(100) | YES | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +----------------+------------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec) |
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:
1 |
GRANT ALL PRIVILEGES ON db_name.* To 'db_user'@'localhost' IDENTIFIED BY 'YourPassword'; |
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:
1 2 |
[RuntimeException] No supported encrypter found. The cipher and / or key length are invalid. |
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:
1 2 |
[PDOException] SQLSTATE[HY000] [2002] No such file or directory |
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
Thanks for the help. Im stuck at folder permission for hours! Now it’s working fine!
I’m glad it helped!
Great help Indeed. the article has given me a head start into Laravel. Millions thanks again.
You’re welcome!