Composer のインストールから Laravel 6.0 開発環境の構築まで

2020年3月25日

PHP のフレームワークのひとつである Laravel の最新版である 6.0 をインストールし、開発環境を構築するまでの手順をまとめてみます。PHPのバージョン7.2以上、Web サーバとして Apache 2.4 がインストールされていることを前提としています。

Composer のインストール

PHP のパッケージ管理ツールである Composer をまずインストールします。Ubuntu であれば apt、Mac であれば brew を使ってインストールするのが手っ取り早いですが、レンタルサーバなどでそういったものが利用できない場合は、手動でもインストールすることができます。

Composer のインストール方法は、公式ページに紹介されていますが、以下のコマンドを順に実行していきます。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

それぞれの行で行っていることを簡単に説明すると、1行目でインストーラーを composer-setup.php という名前でダウンロードし、2行目でインストーラーのファイルが間違っていないか検証、3行目でインストーラーを実行し、4行目でインストーラーを削除しています。

3行目で特に何もいじらずにインストーラーを実行した場合、同じディレクトリに composer.phar が作成されます。インストール先やファイル名を変更したければ

php composer-setup.php --help

を実行すると、オプションの一覧が表示されます。ただ、作成された composer.phar の名前を変えたり、ディレクトリを移動させることは後からでもできるので、インストールの際に特に行わなくてもよいかもしれません。

そうやって作成された composer.phar を適当な場所(/usr/local/bin/ やプロジェクトのディレクトリなど)に移動させたら、インストールは完了です。

Composer の初期設定

インストール直後の状態でも特に問題なく使えるのですが、Composer を使ってインストールできるパッケージが置いてある Packagist というサイトがネットワーク的に遠いので、日本のミラーサイトである Packagist.JP からダウンロードするように設定を変更します。

composer config -g repos.packagist composer https://packagist.jp

さらに、ファイルを並行してダウンロードできるようにするパッケージをインストールします。

composer global require hirak/prestissimo

これでパッケージのダウンロードがだいぶ速くなると思います。

下記の方法に従うと、リリースされている最新の Laravel がインストールされます。バージョンを指定してインストールしたい場合は、Laravel のバージョンを指定してインストールするもあわせてご覧ください。

Laravel 6.0 のインストール

続いて Laravel 6.0 のインストールを行います。インストールの方法は、公式サイトの日本語版にも説明されています。
ここでは、/var/www/ に blog というディレクトリを作ってインストールする例で説明しますが、前提として、/var/www/ に書き込み権限がなければならないので、適宜パーミッションを設定してください。

Laravel のインストーラーのインストール

まず、Laravel のインストーラーをインストールします。

composer global require laravel/installer

指定されたディレクトリに Laravel をインストールする

次に、インストール先の一つ上の階層(例では /var/www/)に移動し、以下のコマンドを実行します。

laravel new blog

このままだと、システムがログを書き込めないので、パーミッションを調整します。Ubuntu の場合、Apache の実行ユーザーは www-data:www-data なので、www-data グループに書き込み権限を与えます(自分のユーザー名を hoge とします)。

sudo chown -R hoge:www-data /var/www/blog/
sudo find /var/www/blog/ -type d -exec chmod 750 {} \;
sudo find /var/www/blog/ -type f -exec chmod 640 {} \;
sudo chmod -R 770 /var/www/blog/storage/ /var/www/blog/bootstrap/cache/

ここまでで基本的なインストールは完了なのですが、ルーティングがうまく動かない(404 Not Found になってしまう)ときには、以下の設定を追加してください。

Apache の mod_rewrite を有効にする

a2enmod rewrite
service apache2 restart

.htaccess を有効にする

Apache のサイト設定で、下記の設定を追加します。

DocumentRoot /var/www/blog/public

<Directory "/var/www/blog/public">
    AllowOverride All
</Directory>

ここまでの結果

ここまでの作業を行い、 http://(サイトのURL、IPアドレスなど)/ にアクセスすると、こんな画面が表示されます。

Laravel のインストール完了時の画面

開発用のパッケージをインストールする

上記までの作業で Laravel のインストールは終わっていますが、開発に役に立つパッケージを追加します。

laravel-debugbar をインストールする

ルーティングや使用しているテンプレート、実行している SQL など、デバッグに役に立つ情報を表示してくれる laravel-debugbar をインストールします。

composer require --dev barryvdh/laravel-debugbar
php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"

インストール後の画面はこんな感じになります。

laravel-debugbar インストール後の画面

laravel-ide-helper をインストールする

laravel-ide-helper は、PhpStorm や IntelliJ IDEA といった IDE(統合開発環境)での開発時に補完の手助けをしてくれるファイルを生成してくれるパッケージです。

composer require --dev barryvdh/laravel-ide-helper
php artisan clear-compiled
php artisan ide-helper:generate
php artisan ide-helper:meta

リモートサーバで開発している場合には、上記の実行後に作成される .phpstorm.meta.php と _ide_helper.php をダウンロードしてください。

言語ファイルのダウンロード

バリデーション時のエラーなどはデフォルトでは英語のメッセージが表示されますが、日本語のメッセージを表示したいときには、言語ファイルを作成する必要があります。そのひな形をダウンロードします。
Laravel のインストールディレクトリ(例では /var/www/blog/)に移動して、以下のコマンドを実行します。

php -r "copy('https://readouble.com/laravel/6.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
php -f install-ja-lang.php
php -r "unlink('install-ja-lang.php');"

これによって生成されるファイルと、英語版の resources/lang/en/validation.php を比較すると、1行だけ足りないので、96行目あたりに以下を追記します。

    'password' => 'パスワードが正しくありません。',

エラーログの出し分け

Laravel のエラーは、デフォルトでは storag/logs/ 以下に保存されるのですが、実行するユーザーの権限でエラーログを生成するため、ユーザー hoge が artisan コマンドを実行し、エラーが出てエラーログが生成された後に、ブラウザでページを表示した際にエラーが発生すると、Apache を実行しているユーザーである www-data にログへの書き込み権限がないために後者のエラーがエラーログに書き込めなくなってしまいます。

解決の方法はいくつかあると思いますが、簡単な方法は、conf/logging.php を以下のように変更します。

        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'days' => 14,
            'permission' => '0666',
        ],

上記の方法は、セキュリティ的にはやや微妙なので、ユーザー別にログファイルを生成するようにします。
まず、conf/logging.php を以下のように変更します。

        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'days' => 14,
            'tap' => [App\Logging\CustomizeFilenames::class],
        ],

次に、app/Logging ディレクトリを作成し、その中に以下の内容で CustomizeFilenames.php を作成します。

<?php
namespace App\Logging;

use Monolog\Handler\RotatingFileHandler;

class CustomizeFilenames
{
    /**
     * Customize the given logger instance.
     *
     * @param  \Illuminate\Log\Logger $logger
     * @return void
     */
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            // ログハンドラーが RotatingFileHandler の場合
            // PHP との間のインターフェイスの型を取得
            if ($handler instanceof RotatingFileHandler) {
                $sapi = php_sapi_name();
                if ($sapi == 'cli') {
                    // artisan コマンドのエラーの場合は「laravel-batch-YYYY-MM-DD.log」に保存
                    $handler->setFilenameFormat("{filename}-batch-{date}", 'Y-m-d');
                } else {
                    // Web からのエラーの場合は「laravel-web-YYYY-MM-DD.log」に保存
                    $handler->setFilenameFormat("{filename}-web-{date}", 'Y-m-d');
                }
            }
        }
    }
}

こうすると、artisan のエラーログは「laravel-batch-YYYY-MM-DD.log」(例:laravel-batch-2019-11-22.log)に、Web からのエラーの場合は「laravel-web-YYYY-MM-DD.log」 (例:laravel-web-2019-11-22.log) に保存されます。

php_sapi_name() の返り値は、使っているサーバによっても異なるようなので(マニュアル参照)、環境に合わせて微調整してください。私の環境では、Web の場合、php_sapi_name() は apache2handler を返しました。

ログの出力については、5.6 以降設定の書き方が変わっているのでご注意を。5.5 までで同じようにログを出力する場合は、 bootstrap/app.php に以下のように記載します。

$app->configureMonologUsing(function ($monolog) use ($app) {
    if (\App::runningInConsole()) {
        $filename = storage_path('logs/laravel-batch.log');
    } else {
        $filename = storage_path('logs/laravel-web.log');
    }
    $handler = new Monolog\Handler\RotatingFileHandler($filename);
    $monolog->pushHandler($handler);
});

おまけ:Ubuntu 環境で必要なパッケージ

上記の作業に必要なパッケージは

apt install composer php-curl php-zip php-mbstring php-xml php-json php-bcmath php-mysql
apt install apache2 libapache2-mod-php 

でインストールすることができます。

この記事を書いた人

グッドネイバー

“ Webに悩むお客さまの「よき隣人」でありたい ” をモットーに、Web システム開発(主に Laravel)、Web マーケティング支援の仕事をしています。詳しい業務内容はこちら。お仕事のご依頼・ご相談はこちらからお気軽にどうぞ。