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-data
とdeveloper
が書き込むディレクトリの権限と 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の設定
プロジェクトルートにある.env
のLOG_CHANNEL
をdaily
にします。
日毎にログが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
再起動後にブラウザから下記にアクセスしてください。
上記のように 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は、便利なのですが若干問題があるようです。