Laravel入門 Laravelプロジェクトの新規作成とマイグレーション(第4回)

2021-01-01
7 min read

Laravel プロジェクトの新規作成と設定をします。マイグレーションファイルからDB上にテーブルを作成します。

Laravelで新規プロジェクトの作成

プロジェクトの作成

/var/www/html にて プロジェクトの新規作成。

$ cd /var/www/html
$ composer create-project --prefer-dist "laravel/laravel=6.*" todo

<中略>

Package manifest generated successfully.
74 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan key:generate --ansi
Application key set successfully.

/var/www/html/todo 以下に展開されます。

Laravelのディレクトリ構成

todo がプロジェクトルートになります。 todo 以下のディレクトリ構成は下記になります。

.
├── app
├── bootstrap
├── config
├── database
├── public
├── resources
├── routes
├── storage
├── tests
└── vendor

Laravel では、php artisan というコマンドを使用します。 その時は、プロジェクトルート直下で使用します。 また、Composer という PHP のパッケージ管理のコマンドにおいてもプロジェクトルート直下で使用します。

主なサブディレクトリについて解説します。

|-- app
|   |-- Console
|   |-- Exceptions
|   |-- Http
|   |   |-- Controllers
|   |   `-- Middleware
|   `-- Providers

主に Http/Controllers を使用します。

|-- config

各種設定用のファイルが格納されています。

|-- database
|   |-- factories
|   |-- migrations
|   `-- seeds

database に関するものです。 テストデータを作る際に利用します。

|-- public

公開ディレクトリです。 Apache のドキュメントルートとして設定します。

|-- resources
|   |-- js
|   |-- lang
|   |   |-- en
|   |   `-- ja
|   |-- sass
|   `-- views
|       `-- layout

静的ファイル(PHP ファイル以外)のディレクトリです。 Blade ファイルを作る際に views/layout を利用します。

|-- routes

web.php というルーティングの設定が格納されています。

|-- storage
|   |-- app
|   |   `-- public
|   |-- framework
|   |   |-- cache
|   |   |-- sessions
|   |   |-- testing
|   |   `-- views
|   `-- logs

storage/logs の中にログ・ファイルが格納されています。

|-- tests
|   |-- Feature
|   `-- Unit

テスト用のプログラムが格納されます。

諸設定

Laravel を正しく動作させるために各種設定をします。

所有者の修正

ディレクトリの所有者を修正します。

$ sudo chown -R developer:developer /var/www/html/todo
$ sudo chown -R :www-data /var/www/html/todo/storage
$ sudo chown -R :www-data /var/www/html/todo/bootstrap/cache

権限の修正

/var/www/html/todo にて以下のコマンドを実行します。

$ cd /var/www/html/todo
$ sudo find ./ -type d -exec chmod 755 {} \;
$ sudo find ./ -type f -exec chmod 644 {} \;

1 行目のコマンドは、カレントディレクトリ以下のディレクトリの権限を 755(rwxr-xr-x)に変更します。 2 行目のコマンドでは、カレントディレクトリ以下のファイルの権限を 644(rw-r--r--)に変更します。

www-datadeveloper が書き込むディレクトリの権限と SGID(Set Group ID)の設定をします。

$ sudo chmod -R 2770 /var/www/html/todo/storage
$ sudo chmod -R 2770 /var/www/html/todo/bootstrap/cache

SGID パーミッションが設定されたディレクトリでは、配下に新規で作られるファイルのグループがディレクトリのグループとなります。

APP_URLの設定

todo 直下の .env ファイルのAPP_URLを下記の指定にします。

APP_URL=http://localhost

logの設定

プロジェクトルートにある.envLOG_CHANNELdailyにします。 日毎にログが1ファイル作成されるようになります。

LOG_CHANNEL=daily

config/logging.php で log の詳細設定として、'permission' を追加します。

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

所有者と所有者のグループに読み込み権限と書き込み権限を付与します。 664ではなく、8進数表記で0664を設定します。

キャッシュの設定

Webからは、Apacheの実行ユーザーであるwww-dataがLaravelを動かし、artisanコマンドなどのシェルからの実行は、コマンドを実行したユーザー(Developer)がLaravelを動かします。

実行ユーザーが異なることで作成されるキャッシュファイルの権限が異なってきます。 一方で作成されたキャッシュファイルが、他方では読み込みができなくなり、 failed to open stream: Permission denied に遭遇します。

それを防ぐために次の設定を行います。

laravel6の場合

/home/developer/.bashrc の最後に下記のumask値を追加します。

umask 002
laravel7の場合

config/cache.php にて、‘permission’ => 0664 を設定します。

  'file' => [
      'driver' => 'file',
      'path' => storage_path('framework/cache/data'),
      'permission' => 0664,
  ],

apacheのDocumentRootを設定

設定ファイルの所有者がrootのためsudoでvi editorを起動してコマンドラインで修正します。

sudo vi /etc/apache2/sites-available/000-default.conf

vi editor を使ったことがない方は、使い方を検索してみてください。

<VirtualHost *:80>
	# The ServerName directive sets the request scheme, hostname and port that
	# the server uses to identify itself. This is used when creating
	# redirection URLs. In the context of virtual hosts, the ServerName
	# specifies what hostname must appear in the request's Host: header to
	# match this virtual host. For the default virtual host (this file) this
	# value is not decisive as it is used as a last resort host regardless.
	# However, you must set it for any further virtual host explicitly.
	#ServerName www.example.com

	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/html

	# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
	# error, crit, alert, emerg.
	# It is also possible to configure the loglevel for particular
	# modules, e.g.
	#LogLevel info ssl:warn

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	# For most configuration files from conf-available/, which are
	# enabled or disabled at a global level, it is possible to
	# include a line for only one particular virtual host. For example the
	# following line enables the CGI configuration for this host only
	# after it has been globally disabled with "a2disconf".
	#Include conf-available/serve-cgi-bin.conf
</VirtualHost>

‘DocumentRoot’を、‘todo’配下の公開ディレクトリーに変更して保存します。

変更前:

DocumentRoot /var/www/html

変更後:

DocumentRoot /var/www/html/todo/public

apacheのmod_rewriteの有効化

apacheのrewriteモジュールを有効化します。

sudo a2enmod rewrite

apacheの設定を修正します。

sudo vi /etc/apache2/apache2.conf

下記のAllowOverride を None から All に変更して保存します。


<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

PHP.iniの設定

設定ファイルの所有者がrootのためsudoでvi editorを起動してコマンドラインで修正します。

sudo vi /etc/php/7.4/apache2/php.ini 

php.ini ファイル上で下記の左側の名称を探して右側の項目に変更してください。

[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

[Other]
memory_limit = -1

「/」を入力すると検索モードになります。

Webの動作確認

設定に問題がないか確認します。

apacheを再起動します。

sudo service apache2 restart

再起動後にブラウザから下記にアクセスしてください。

http://localhost/

laravel初期画面

上記のように Laravel の初期画面が表示されれば OK です。

Databaseへの接続

接続情報の設定

ルート直下の.envファイルにて接続情報を設定します。

DB_CONNECTION=pgsql
DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=todo
DB_USERNAME=developer
DB_PASSWORD=developer

疎通確認

Laravel Tinker で、データベースへの疎通確認をします。

Tinker を使うことでコマンドラインから Laravel の API を実行できます。 todoディレクトリー直下で、Tinker を起動します。

$ cd /var/www/html/todo
$ php artisan tinker

その後、下記を入力してください。

>>> DB::SELECT('select 1+1');

下記のように表示されれば、データベースへの接続が成功しています。

=> [
     {#3399
       +"?column?": 2,
     },
   ]

tasksテーブルのレコード取得してみましょう。

>>> DB::table('tasks')->get();

上記命令で下記の通り、tasksテーブルのレコード内容が取得されます。

>>> DB::table('tasks')->get();
=> Illuminate\Support\Collection {#3315
     all: [
       {#3301
         +"id": 1,
         +"title": "bitcoinの半減期を調べる",
         +"status": 2,
         +"description": "bitcoinの半減期と価格の相関性を調べる",
         +"created_at": null,
         +"updated_at": null,
       },
       {#3322
         +"id": 2,
         +"title": "サンフランシスコ旅行",
         +"status": 1,
         +"description": "サンノゼ空港からパロ・アルトへの行き方を調べる",
         +"created_at": null,
         +"updated_at": null,
       },
       {#3323
         +"id": 3,
         +"title": "アクアパッツァ",
         +"status": 1,
         +"description": "再来週の食事会のためにアクアパッツァの作り方を学ぶ",
         +"created_at": null,
         +"updated_at": null,
       },
       {#3324
         +"id": 4,
         +"title": "サンフランシスコ行きの航空券",
         +"status": 3,
         +"description": "羽田からサンノゼ空港行きのチケットを予約",
         +"created_at": null,
         +"updated_at": null,
       },
     ],
   }

Tinker から抜けます。

>>> exit
Exit:  Goodbye

マイグレーションファイルの作成

テストのときにマイグレーションファイルが必要となってきます。

laravle の入門者などでは、マイグレーションでテーブルの構築をする場合がほとんどです。 しかし、今回は既にテーブルなどは作成済みです。

こういう場合は、既にあるテーブルからマイグレーションファイルを生成します。 生成には下記のツールを利用します。

https://github.com/oscarafdev/migrations-generator

インストールします。

$ composer require oscarafdev/migrations-generator --dev

マイグレーションファイルを生成します。

$ php artisan migrate:generate
 Do you want to log these migrations in the migrations table? [Y/n] :
 > Y

Migration table created successfully.

 Next Batch Number is: 1. We recommend using Batch Number 0 so that it becomes the "first" migration [Default: 0] :
 > 

Setting up Tables and Index Migrations
Created: /var/www/html/todo/database/migrations/2021_01_29_062122_create_tasks_table.php

Setting up Foreign Key Migrations


Finished!

database/migrations/YYYY_MM_DD_HHMMSS_create_tasks_table.php というファイルができています。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTasksTable extends Migration {

	/**
	 * Run the migrations.
	 *
	 * @return void
	 */
	public function up()
	{
		Schema::create('tasks', function(Blueprint $table)
		{
			$table->bigInteger('id', true);
			$table->string('title', 40);
			$table->integer('status');
			$table->string('description', 200)->nullable();
			$table->timestamps(10);
		});
	}


	/**
	 * Reverse the migrations.
	 *
	 * @return void
	 */
	public function down()
	{
		Schema::drop('tasks');
	}

}

up()メソッドにテーブルの定義が記述されています。

ただし、idフィールドの属性に誤りがあります。

Laravel6.xにおいては$table->bigIncrements('id'); に修正します。

Laravel7.xにおいては$table->id(); に修正します。

oscarafdev/migrations-generatorは、便利なのですが若干問題があるようです。