- 投稿日:2019-07-08T20:42:49+09:00
Laravelのマイグレーションファイル名は形式が決まっているようなのでメモ
Laravelでcreated_users_table.phpというマイグレーションファイルを作成して、実行したところ、エラーがでた。
database/migrations/create_users_table.php作成$ php artisan migrate Symfony\Component\Debug\Exception\FatalThrowableError : Class '' not found 436| public function resolve($file) 437| { 438| $class = Str::studly(implode('_', array_slice(explode('_', $file), 4))); 439| > 440| return new $class; 441| } 442| 443| /** 444| * Get all of the migration files in a given path.ああ、マイグレーションファイル名の形式は指定されているみたい。。
正しいファイル名は下記を参考
2019_07_05_052836_create_users_table.phpついでに、
$class = Str::studly(implode('_', array_slice(explode('_', $file), 4)));が何をしているかっていうと、
Str::studly
はLaravelのヘルパ関数で、文字列をアッパーキャメルケースに変換。
https://readouble.com/laravel/5.7/ja/helpers.html#method-studly-caseimplodeは指定の文字列で連結
explodeは指定の文字列で分割
array_sliceは配列の一部を展開流れを出力してみると、
$file = "2019_07_05_052836_create_users_table"; $file = explode('_', $file); var_dump($file); $file = array_slice($file, 4); var_dump($file); $file = implode('_', $file); var_dump($file);出力結果array(7) { [0]=> string(4) "2019" [1]=> string(2) "07" [2]=> string(2) "05" [3]=> string(6) "052836" [4]=> string(6) "create" [5]=> string(5) "users" [6]=> string(5) "table" } array(3) { [0]=> string(6) "create" [1]=> string(5) "users" [2]=> string(5) "table" } string(18) "create_users_table"取得できた
create_users_table
に対して、Str::studly
でアッパーキャメルケース(CreateUsersTable)に変換して、return new $class;インスタンスを生成しているのですなぁ。
これは、自分でも使えそうなので、覚えておく。
- 投稿日:2019-07-08T18:17:16+09:00
nginx + Laravel でホーム以外のページの404エラー解決
はじめに
前回はnginx + MySQL + Laravelの環境構築をしてトップページの表示まで行いました。さて、もりもり開発始めるぞー!と思った が矢先、、 ログイン認証してみようと思ったら404エラー。なんでや、、と頭を抱えました。ルーティングに何もおかしいところはないし、どうしたものか、と思ったのですが原因はlaravel側ではなくnginxの設定だったようです。記事書いた時にnginxわかんないなぁ〜って放置したのはダメだったようです。わからないとこはちゃんと潰しておこう。。。。修正前の元のファイル
さて、元のnginxのファイルであるdefault.confを見てみます。
default.confserver { listen 80; index index.php index.html; root /var/www/beer/public/; location / { root /var/www//beer/public; index index.html index.php; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }結論から言ってしまうとこれダメダメすぎますね。数日前の自分が恥ずかしい。
記述の意味の理解と修正
まず、このファイルをディレクティブごとに読み解いていきます。
listen 80; index index.php index.html; root /var/www/beer/public/;ここではサーバーのIPアドレスとポート番号を宣言し、そのあとに公開するディレクトリを宣言しています。
IPアドレスとポート番号は、listen IPアドレス:ポート番号
のように書きます。
しかし今回はIPアドレスが記載されていませんよね。この書き方は、listen *:ポート番号
と同じ意味を表しており、IPアドレスにはデフォルト値が用いられることになります。
root /var/www/beer/public/;
は公開するディレクトリの宣言、
index index.php index.html;
はリクエストuriが/で終わっている時にインデックスとして返されるファイルを表しています。index.phpが存在すればindex.phpを返し、存在しなければindex.htmlを返します。どちらも存在しない場合のリダイレクト先を設定したい場合は、index index.php index.html /ファイルがどちらもない場合のリダイレクト先;
のようにします。locationディレクティブ
location / { root /var/www/beer/public; index index.html index.php; }さて、問題はここにありました。まずはこのlocationディレクティブについてです。
locationディレクティブではuriのパスごとの設定を記述することができます。つまりこれは、「ホスト名/ にアクセスしたら、/var/www/beer/public と言うファイルパスを返す」と言う意味になります。
rootは先ほど宣言しているものと同じ公開ディレクトリのため、宣言する必要がないので消します。また、ここでindexを指定してしまうとこの二つのファイルしか開かないという設定になってしまうので修正します。そこで、location / { try_files $uri $uri/ /index.php?$query_string; }とします。これは、「ホスト名/ にアクセスしたら、まずリクエストURIで処理、次にindex.phpで処理を試みる」という意味です。こうすることで全てのURIに対応できます。
locationディレクティブその2
location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; }
try_files $uri =404;
なんて記述のせいでindexの指定ファイルがなかったら404返されてたんですね。アホらしいです。大反省です。消します。残りの行ですが、これはphpの処理を行うのに必要な記述だそうです。ここの解説はまた今度(まだよくわからない)
最終的にdefault.confはこんな感じになります。
default.confserver { listen 80; root /var/www//beer/public; index index.html index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }最後に
nginxは奥が深い。
ディレクティブの修飾子とか優先順位とかについても今度書きたいな。
参考文献
nginx実践入門
https://www.amazon.co.jp/nginx%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-WEB-DB-PRESS-plus/dp/4774178667
- 投稿日:2019-07-08T17:30:45+09:00
Seederを使ったテストデータの作成
Seederとは
テストデータをデータベースに設定するための機能。シーダーは
database/seeds
に保存する。
デフォルトでDatabaseSeederクラスが定義されている。このクラスからcallメソッドで他のシーダーを呼び出すことで、シーディングの順番をコントロールできる。テーブル名について
Seederを使うに当たって、テーブル名を複数形で定義した方が都合が良い。
例えば、テーブル名hoges、レコードhogeのようなイメージ。シーダーの生成
シーダーを作成するには以下のコマンドを実行します。作成されたシーダーは
database/seeds
に格納されます。$ php artisan make:seeder HogesTableSeederシーダーを利用するためにはDatabaseSeederに呼び出したいシーダーを追加します。
database/seeds/DatabaseSeeder.php<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $this->call(HogesTableSeeder::class); } }シーダーの編集
database/seeds/HogesTableSeeder.php<?php use Illuminate\Database\Seeder; class HogesTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // ここにレコードを追加処理を記述する $now = \Carbon\Carbon::now(); for () { $hoge = [ "name" => "name" . $i, "mail" => "user" . $i . "@localhost", "created_at" => $now, "updated_at" => $now, ]; DB::table("hoges")->insert($hoge); } } }シーダーの実行
// DataBaseSeederを実行する $ php artisan db:seed // 特定のファイルを個別に実行する $ php artisan db:seed --class=HogesTableSeederデータベースを完全に再作成したい場合は、以下のコマンドが便利。
$ php artisan migrate:refresh --seed参考
- 投稿日:2019-07-08T17:30:45+09:00
[Laravel][Homestead] Seederを使ってテストデータを作成してみる
Seederとは
テストデータをデータベースに設定するための機能。シーダーは
database/seeds
に保存する。
デフォルトでDatabaseSeederクラスが定義されている。このクラスからcallメソッドで他のシーダーを呼び出すことで、シーディングの順番をコントロールできる。テーブル名について
Seederを使うに当たって、テーブル名を複数形で定義した方が都合が良い。
例えば、テーブル名hoges、レコードhogeのようなイメージ。シーダーを生成してみる
シーダーを作成するには以下のコマンドを実行します。作成されたシーダーは
database/seeds
に格納されます。$ php artisan make:seeder HogesTableSeederシーダーを利用するためにはDatabaseSeederに呼び出したいシーダーを追加します。
database/seeds/DatabaseSeeder.php<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $this->call(HogesTableSeeder::class); } }シーダーを編集してみる
database/seeds/HogesTableSeeder.php<?php use Illuminate\Database\Seeder; class HogesTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // ここにレコードを追加処理を記述する $now = \Carbon\Carbon::now(); for ($i = 1; $i <= 50; $i++) { $hoge = [ "name" => "name" . $i, "mail" => "user" . $i . "@localhost", "created_at" => $now, "updated_at" => $now, ]; DB::table("hoges")->insert($hoge); } } }シーダーを実行してみる
// DataBaseSeederを実行する $ php artisan db:seed // 特定のファイルを個別に実行する $ php artisan db:seed --class=HogesTableSeedertestapp_db=# select * from hoges; id | name | mail | comment | type | created_at | updated_at ----+--------+------------------+---------+------+---------------------+--------------------- 1 | name1 | user1@localhost | | C | 2019-07-11 01:41:02 | 2019-07-11 01:41:02 2 | name2 | user2@localhost | | C | 2019-07-11 01:41:02 | 2019-07-11 01:41:02 3 | name3 | user3@localhost | | C | 2019-07-11 01:41:02 | 2019-07-11 01:41:02 4 | name4 | user4@localhost | | C | 2019-07-11 01:41:02 | 2019-07-11 01:41:02 5 | name5 | user5@localhost | | C | 2019-07-11 01:41:02 | 2019-07-11 01:41:02 6 | name6 | user6@localhost | | C | 2019-07-11 01:41:02 | 2019-07-11 01:41:02 7 | name7 | user7@localhost | | C | 2019-07-11 01:41:02 | 2019-07-11 01:41:02 8 | name8 | user8@localhost | | C | 2019-07-11 01:41:02 | 2019-07-11 01:41:02 9 | name9 | user9@localhost | | C | 2019-07-11 01:41:02 | 2019-07-11 01:41:02 (以下略)データベースを完全に再作成したい場合は、以下のコマンドが便利。
$ php artisan migrate:refresh --seed参考
- 投稿日:2019-07-08T16:55:44+09:00
[Laravel][Homestead] マイグレーションしてみる
マイグレーションとは
データベースのバージョンコントロールのようなもの。
マイグレーションファイルを準備して、マイグレーションを実行することでテーブルの反映やロールバックをすることができます。マイグレーションファイルの場所
マイグレーションファイルは
database/migrations/
に配置します。初期状態で2つのファイルが用意されています。./ └database └migrations 2018 2014_10_12_000000_create_users_table.php* 2018 2014_10_12_100000_create_password_resets_table.php*マイグレーションを実行してみる
以下のコマンドを実行すると
database/migrations
フォルダ下のマイグレーションファイルのうち、まだ反映されていないものが一括反映されます。$ php artisan migrateマイグレーションを強制する場合は、--forceフラグを指定します。
$ php artisan migrate --force直前に実行した反映を取り消したい場合は、ロールバックを実行します。
$ php artisan migrate:rollback直近の数回の実行を取り消したい場合、--stepフラグを指定します。
$ php artisan migrate:rollback --step=5全てのマイグレーションをまとめて取り消す場合は、リセットを実行します。
$ php artisan migrate:resetmigrationファイルの作成
以下のコマンドを実行してマイグレーションファイルを作成します。指定するファイル名を「create_hoge_table」にすると、hogeテーブルを作成するためのコマンドが追加されます。
$ php artisan make:migration create_hoge_table Created Migration: 2019_07_08_072918_create_hoge_tableコマンドが成功すると、
database/migrations
にファイルが作成されます。
マイグレーションはupとdownのメソッドを含んでいます。
upは追加や変更処理を実行し、downはupメソッドが行った操作を元に戻します。2019_07_08_072918_create_hoge_table<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateHogeTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('hoge', function (Blueprint $table) { $table->increments('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('hoge'); } }テーブルを定義してみる
マイグレーションファイルのテーブル定義はupメソッドに記述する。
カラムタイプ
使いそうなものを列挙。
コマンド 説明 $table->bigIncrements("id"); 符号なしBIGINTインクリメント $table->bigInteger("votes"); BIGINT $table->binary("data"); BLOB $table->boolean("confirmed"); BOOLEAN $table->char("name", 100); CHAR $table->date("created_at"); DATE $table->dateTime("created_at"); DATETIME $table->dateTimeTz("created_at"); DATETIME(タイムゾーン付き) $table->decimal("amount", 8, 2); DECIMAL $table->double("amount", 8, 2); DOUBLE $table->float("amount", 8, 2); FLOAT $table->integer("votes"); INTEGER $table->smallInteger("votes"); SMALLINT $table->string("name", 100); VARCHAR $table->text("description"); TEXT $table->time("sunrise"); TIME $table->timeTz("sunrise"); TIME(タイムゾーン付き) $table->timestamp("added_on"); TIMESTAMP $table->timestampTz("added_on"); TIMESTAMP(タイムゾーン付き) カラム修飾子
使いそうなものを列挙。
コマンド 説明 ->default($value) デフォルト値を設定 ->nullable($value = true) デフォルトでNULL値を挿入する ->useCurrent() TIMESTAMPのデフォルトにCURRENT_TIMESTAMPを指定 インデックス修飾子
使いそうなものを列挙。
コマンド 説明 $table->primary("id"); 主キー追加 $table->primary(["id", "parent_id"]); 複合キー追加 $table->unique("email"); uniqueキー追加 $table->index("state"); インデックス追加 外部キー制約
postsテーブルのuser_idが、usersテーブルのidを参照している場合、次の通り定義する。
Schema::table('posts', function (Blueprint $table) { $table->unsignedInteger('user_id'); $table->foreign('user_id')->references('id')->on('users'); }「削除時(on delete)」と「更新時(on update)」に対する処理をオプション指定することもできる。
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');以上を踏まえて実際にテーブルを定義してみる。
2019_07_08_072918_create_hoge_table<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateHogeTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('hoge', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name', 20); $table->string('mail', 256); $table->text('comment')->nullable(); $table->char('type', 1)->default('C'); $table->timestamps(); $table->unique('mail'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('hoge'); } }参考
- 投稿日:2019-07-08T15:52:29+09:00
[Laravel][Homestead] 使用するデータベースをPostgreSQLに変更してみる
データベースの初期設定がMySQLになっているので、安心のPostgreSQLに変更してみる。
PostgreSQLにログインしてみる
パスワードのデフォルトは「secret」。
$ psql -hlocalhost -UhomesteadUTF8指定してデータベースを作成してみる
homestead=# CREATE DATABASE db_name ENCODING UTF8;Laravelプロジェクトの設定を変更してみる
.env... DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5432 DB_DATABASE=db_name DB_USERNAME=homestead DB_PASSWORD=secret ...参考
- 投稿日:2019-07-08T15:23:27+09:00
[Laravel] テストを実行してみる
テストを実行してみます。
関連ファイルの場所
パス 説明 phpunit.xml テスト設定ファイル tests/Feature/ 機能テストのテストコードを配置する。
多くのオブジェクトの関連や、JSONエンドポイントへのHTTPリクエストなど幅広い範囲をテストするtests/Unit/ ユニットテストのテストコードを配置する。
極小さい、コードの独立した一部をテストする。テストの実行
phpunitを実行する。全てのテストコードが実行される。
$ phpunit PHPUnit 6.5.14 by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: 1.63 seconds, Memory: 12.00MB OK (2 tests, 2 assertions)ファイルを指定することで一部のみテストすることができる。
$ phpunit tests/Feature/ExampleTest.php PHPUnit 6.5.14 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 1.56 seconds, Memory: 12.00MB OK (1 test, 1 assertion)新しいテストケースを作成する
// Featureディレクトリにテストを生成する $ php artisan make:test UserTest // Unitディレクトリにテストを生成する $ php artisan make:test UserTest --unitテストの実行例
既存の
welcome.blade.php
を使用してテストを実行してみます。
表示されたページにHello, Laravel
の文字が含まれるかテストしてみます。テストファイルを作成します。
$ php artisan make:test WelcomeTest Test created successfully.テストコードを記述します。
textExample
の中身を次の通り書きかえます。
使用しているアサートはこんな感じです。
assertSeeText ... 指定した文字列がレスポンステキストに含まれていることをアサート。
assertStatus ... クライアントのレスポンスが指定したコードであることをアサート。$ vi tests/Feature/WelcomeTest <?php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; class WelcomeTest extends TestCase { /** * A basic test example. * * @return void */ public function testExample() { $response = $this->get('/'); $response->assertSeeText("Hello, Laravel") ->assertStatus(200); } }テストを実行します。ウェルカムページに
Hello, Laravel
が含まれないのでテストは失敗します。vagrant@homestead:~/code/testapp$ phpunit tests/Feature/WelcomeTest.php PHPUnit 6.5.14 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 1.6 seconds, Memory: 12.00MB There was 1 failure: 1) Tests\Feature\WelcomeTest::testExample Failed asserting that '\n (省略) ' contains "Hello, Laravel". /home/vagrant/code/testapp/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:266 /home/vagrant/code/testapp/tests/Feature/WelcomeTest.php:20 FAILURES! Tests: 1, Assertions: 1, Failures: 1.
welcome.blade.php
を編集します。... <div class="content"> <div class="title m-b-md"> Hello, Laravel </div> ...もう一度テストを実行します。今度は成功します。
vagrant@homestead:~/code/testapp$ phpunit tests/Feature/WelcomeTest.php PHPUnit 6.5.14 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 1.56 seconds, Memory: 12.00MB OK (1 test, 2 assertions)参考
- 投稿日:2019-07-08T15:23:27+09:00
[Laravel][Homestead] テストを実行してみる
テストを実行してみます。
関連ファイルの場所を確認してみる
パス 説明 phpunit.xml テスト設定ファイル tests/Feature/ 機能テストのテストコードを配置する。
多くのオブジェクトの関連や、JSONエンドポイントへのHTTPリクエストなど幅広い範囲をテストするtests/Unit/ ユニットテストのテストコードを配置する。
極小さい、コードの独立した一部をテストする。テストを実行してみる
phpunitを実行する。全てのテストコードが実行される。
$ phpunit PHPUnit 6.5.14 by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: 1.63 seconds, Memory: 12.00MB OK (2 tests, 2 assertions)ファイルを指定することで一部のみテストすることができる。
$ phpunit tests/Feature/ExampleTest.php PHPUnit 6.5.14 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 1.56 seconds, Memory: 12.00MB OK (1 test, 1 assertion)新しいテストケースを作成してみる
// Featureディレクトリにテストを生成する $ php artisan make:test UserTest // Unitディレクトリにテストを生成する $ php artisan make:test UserTest --unitテストケースの作成からテストの実行までを試してみる
既存の
welcome.blade.php
を使用してテストを実行してみます。
表示されたページにHello, Laravel
の文字が含まれるかテストしてみます。テストファイルを作成します。
$ php artisan make:test WelcomeTest Test created successfully.テストコードを記述します。
textExample
の中身を次の通り書きかえます。
使用しているアサートはこんな感じです。
assertSeeText ... 指定した文字列がレスポンステキストに含まれていることをアサート。
assertStatus ... クライアントのレスポンスが指定したコードであることをアサート。tests/Feature/WelcomeTest<?php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; class WelcomeTest extends TestCase { /** * A basic test example. * * @return void */ public function testExample() { $response = $this->get('/'); $response->assertSeeText("Hello, Laravel") ->assertStatus(200); } }テストを実行します。ウェルカムページに
Hello, Laravel
が含まれないのでテストは失敗します。vagrant@homestead:~/code/testapp$ phpunit tests/Feature/WelcomeTest.php PHPUnit 6.5.14 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 1.6 seconds, Memory: 12.00MB There was 1 failure: 1) Tests\Feature\WelcomeTest::testExample Failed asserting that '\n (省略) ' contains "Hello, Laravel". /home/vagrant/code/testapp/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:266 /home/vagrant/code/testapp/tests/Feature/WelcomeTest.php:20 FAILURES! Tests: 1, Assertions: 1, Failures: 1.
welcome.blade.php
を編集します。welcome.blade.php... <div class="content"> <div class="title m-b-md"> Hello, Laravel </div> ...もう一度テストを実行します。今度は成功します。
vagrant@homestead:~/code/testapp$ phpunit tests/Feature/WelcomeTest.php PHPUnit 6.5.14 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 1.56 seconds, Memory: 12.00MB OK (1 test, 2 assertions)参考
- 投稿日:2019-07-08T14:00:43+09:00
[Laravel] ウェルカムページをいじってみる
Laravelのインストールが終わったので、ウェルカムページをいろいろ触ってみます。
welcomeページの内容を変更する
Laravelのルーティングの設定は
routes/web.php
に記述されています。
この場合、http://homestead.test/
へアクセスされた時にwelcomeビューを表示するということです。routes/web.php
<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); });ウェルカムページのビューファイルは
resources/views/
配下のwelcome.blade.php
です。
試しにwelcome.blade.phpのbodyタグ内を変更して、http://homestead.test/
へアクセスすると内容が変更されているはずです。ウェルカムページのURLを変更する
web.php
を次のように変更してみます。Route::get('/welcome', function () { return view('welcome'); });すると、
http://homestead.test/welcome/
でアクセスした場合はウェルカムページが表示され、http://homestead.test/
へアクセスするとページが見つかりませんと表示されます。Controllerを使用したwelcomeページの表示
プロジェクトの直下で以下のコマンドを実行して、コントローラを作成します。
$ php artisan make:controller WelcomeController Controller created successfully.作成されたコントローラを次のように編集します。
app/Http/Controllers/WelcomeController.php
<?php namespace App\Http\Controller; use Illuminate\Http\Request; class WelcomeController extends Controller { // ここから追加 public function index() { // 指定されたビューを返す return view('welcome'); } // ここまで追加 }ルーティングの設定をクロージャーからコントローラに変更します。
routes/web.php
Route::get('/', 'WelcomeController@index');
http://homestead.test/
へアクセスするとwelcomeビューの内容が表示されます。ディレクトリ構成
./ ├ app │ └Http │ └Controllers ... コントローラを格納する ├ resources │ └views ... ビューを格納する └ routes ... ルーティングを格納する参考
- 投稿日:2019-07-08T14:00:43+09:00
[Laravel][Homestead] ウェルカムページをいじってみる
Laravelのインストールが終わったので、ウェルカムページをいろいろ触ってみます。
welcomeページの内容を変更してみる
Laravelのルーティングの設定は
routes/web.php
に記述されています。
この場合、http://homestead.test/
へアクセスされた時にwelcomeビューを表示するということです。routes/web.php<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); });ウェルカムページのビューファイルは
resources/views/
配下のwelcome.blade.php
です。
試しにwelcome.blade.phpのbodyタグ内を変更して、http://homestead.test/
へアクセスすると内容が変更されているはずです。ウェルカムページのURLを変更する
web.php
を次のように変更してみます。routes/web.phpRoute::get('/welcome', function () { return view('welcome'); });すると、
http://homestead.test/welcome/
でアクセスした場合はウェルカムページが表示され、http://homestead.test/
へアクセスするとページが見つかりませんと表示されます。Controllerを使用したwelcomeページの表示
プロジェクトの直下で以下のコマンドを実行して、コントローラを作成します。
$ php artisan make:controller WelcomeController Controller created successfully.作成されたコントローラを次のように編集します。
app/Http/Controllers/WelcomeController.php<?php namespace App\Http\Controller; use Illuminate\Http\Request; class WelcomeController extends Controller { // ここから追加 public function index() { // 指定されたビューを返す return view('welcome'); } // ここまで追加 }ルーティングの設定をクロージャーからコントローラに変更します。
routes/web.phpRoute::get('/', 'WelcomeController@index');
http://homestead.test/
へアクセスするとwelcomeビューの内容が表示されます。ディレクトリ構成
./ ├ app │ └Http │ └Controllers ... コントローラを格納する ├ resources │ └views ... ビューを格納する └ routes ... ルーティングを格納する参考
- 投稿日:2019-07-08T11:08:03+09:00
Laravelの開発環境を構築してみる(Windows 8.1 + Homestead)
はじめに
最近Laravelの勉強を始めました。Laravelを使いこなせるようになるまでの足跡を残していきたいと思います。
開発環境について
開発環境は「Homestead」を使って構築します。
OSは「Windows 8.1」を使用します。ツールのインストール
以下のツールを公式サイトからダウンロードしてインストールします。
名前 説明 Git 分散型バージョン管理システム VirtualBox OS上で仮想サーバを使うことができる Vagrant 仮想化ソフトウェアの操作を支援する Gitのインストール
公式サイトからインストーラをダウンロードします。インストーラを実行し、画面の指示に従ってインストールします。「Git BASH」を起動して、以下のコマンドでインストールの確認をします。
$ git --version git version 2.21.0.windows.1VirtualBoxのインストール
公式サイトからインストーラをダウンロードします。インストーラを実行し、画面の指示に従ってインストールします。
Vagrantのインストール
公式サイトからインストーラをダウンロードします。インストーラを実行し、画面の指示に従ってインストールします。
「Git BASH」を起動して、以下のコマンドでインストールの確認をします。$ vagrant --version Vagrant 2.2.4ディレクトリ構成
実際に構築する開発環境のディレクトリ構成は次の通りとします。プロジェクト名はtestappとします。
ローカル環境
説明 パス 仮想環境との共有ディレクトリ (ユーザディレクトリ)/code Laravelプロジェクト (ユーザディレクトリ)/code/testapp Homesteadダウンロード先 (ユーザディレクトリ)/Homestead 仮想環境
説明 パス 物理環境との共有ディレクトリ /home/vagrant/code Laravelプロジェクト /home/vagrant/code/testapp nginxドキュメントルート /home/vagrant/code/testapp/public Homesteadのダウンロード
以下のコマンドを実行してHomesteadをダウンロードします。
$ vagrant box add laravel/homestead入力を求められたら、virtualboxの3を入力します。ダウンロードが完了するまで気長に待ちます。
1) hyperv 2) parallels 3) virtualbox 4) vmware_desktop Enter your choice: 3次の通り表示されたら完了です。
==> box: Successfully added box 'laravel/homestead' (v7.1.0) for 'virtualbox'!続いて、以下のコマンドでHomesteadの設定をダウンロードします。
$ cd $ git clone https://github.com/laravel/homestead.git HomesteadHomesteadの初期化
以下のコマンドでHomesteadの初期化をします。
$ cd ~/Homestead $ bash init.sh Homestead initialized!SSH鍵ファイルの作成
SSH鍵がない場合は作成します。パスフレーズの有無は自由です。
$ cd $ mkdir .ssh && cd $_ $ ssh-keygen -t rsaHomesteadの設定
Homestead.yamlファイルをディレクトリ構成に合わせて編集します。以下は編集後(コメント行除く)です。
Homestead.yaml--- ip: "192.168.10.10" memory: 2048 cpus: 1 provider: virtualbox authorize: ~/.ssh/id_rsa.pub keys: - ~/.ssh/id_rsa folders: - map: ~/code to: /home/vagrant/code sites: - map: homestead.test to: /home/vagrant/code/testapp/public databases: - homestead物理環境の共有ディレクトリを作成します。
$ cd $ mkdir codehostsの設定をします。hostsファイルに以下の設定を追加し、ホスト名(homestead.test)でアクセスできるようにします。
C:\Windows\System32\drivers\etc\hosts
192.168.10.10 homestead.testVagrantの起動
$ cd ~/Homestead $ vagrant up使いそうなvagrantのコマンドは次の通りです。
コマンド 説明 vagrant start 仮想マシンを起動する vagrant halt 仮想マシンを停止する vagrant reload --provision Homestead.yamlの変更を反映させる vagrant status 仮想マシンのステータスを表示する vagrant destroy 仮想マシンを破棄する vagrant ssh 仮想マシンにssh接続する Laravelプロジェクトの作成
仮想環境へログインします。
$ vagrant sshcomposerを使用して、以下のコマンドでプロジェクトを作成します。
$ cd ~/code/ $ composer create-project laravel/laravel testapp --prefer-dist "5.5.*"ブラウザで
http://homestead.test
へアクセスして、Laravelのwelcome画面が表示されれば成功です。参考
- Laravel Document
- 竹澤勇貴・栗生和明・新原雅司・大村創太郎(2018)『PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5LTS対応』ソシム
- 投稿日:2019-07-08T09:28:42+09:00
【複数プロジェクト対応】Laravel開発環境をDockerを使って用意する
Laravel
Vagrantを使った開発環境 Homestead
Vagrant仮想環境を使って開発をする場合はこちらを参照してください。
https://readouble.com/laravel/5.8/ja/homestead.htmlDockerを使った開発環境 Laradock
今回のドキュメントはDockerを使った開発環境の構築を行います。
https://laradock.io/複数プロジェクトに対応した構成でインストールする
仕事として使い始める方、趣味の延長でウェブサービスを作りたい方など、開発マシン上に複数のプロジェクトを作ることがあります。
上記の場合、プロジェクト毎にミドルウェアのバージョンが指定される場合があり、他のプロジェクトに影響させたくない場合は仮想環境を個別に用意することになります。
ここで示す例は個別に仮想環境を用意する方法の手順を示します。
構築例
プロジェクトfugaとプロジェクトmogeを共存させ、仮想環境はそれぞれ独自で動くものとする。
構成─ Laravel # ここの名前はお好きに。Laravelプロジェクトを入れる的な。 │ ├── fuga | ├── app | ├── data | └── laradock │ ├── .env │ └── docker-compose.yml ├── moge | ├── app | ├── data | └── laradock │ ├── .env │ └── docker-compose.yml注意点は複数プロジェクトでdockerコンテナがバッティングする
複数プロジェクトをdockerで立ち上げるとき、コンテナのバッティングが発生して作成に失敗するので、それを回避するためいくつかポイントがあります。
最初にプロジェクトfugaを作る
最初に作ったプロジェクトを、以降のプロジェクトの雛形にするため、注意深く作成しましょう。
まずプロジェクトをまとめるディレクトリ
fuga
を作成し、その中にlaradockをgit clone
します。$ mkdir fuga;cd $_ $ git clone https://github.com/Laradock/laradock.gitこの段階で以下の構成になります。
構成─ Laravel │ ├── fuga | └── laradock │ ├── env-example │ └── docker-compose.ymldocker-compose実行
docker-compose.yml
に値を注入するため、env-example
をコピーして.env
を作り、fuga
プロジェクト用の設定を行います。$ cp env-example .env $ vi .env書き換える場所は以下の部分で。 最初の2行はfugaプロジェクト内を指すように変更して、PORTはプロジェクトごとにバッティングしないように利用するミドルウェアのPORTを変更します。
APP_CODE_PATH_HOST=../app/ DATA_PATH_HOST=../data COMPOSE_PROJECT_NAME=fugalaradock # ポイント! 一意にしてコンテナ名のバッティングを防ぐ! NGINX_HOST_HTTP_PORT=8099 NGINX_HOST_HTTPS_PORT=4499 APACHE_HOST_HTTP_PORT=8099 APACHE_HOST_HTTPS_PORT=4499 WORKSPACE_SSH_PORT=2299 MYSQL_PORT=3399コンテナ立ち上げの準備ができました。 さっそく立ち上げてみましょう!
一番最初に実行したときはかなりの時間がかかるので、気長に待ちましょう( ´ー`)y-~~$ docker-compose up -d nginx mysql workspace : : Creating fugalaradock_docker-in-docker_1 ... done Creating fugalaradock_mysql_1 ... done Creating fugalaradock_workspace_1 ... done Creating fugalaradock_php-fpm_1 ... done Creating fugalaradock_nginx_1 ... done最後にエラーが出なかったら成功です。 ただしこの状態ではサーバ環境が揃っただけなので、
http://localhost:8099
でアクセスしても何も表示されません。この段階で以下の構成になります。
構成─ Laravel │ ├── fuga | ├── app # .envのAPP_CODE_PATH_HOSTの設定により生成 # コンテナ内の /var/wwwの位置になる | ├── data # .envのDATA_PATH_HOSTの設定により生成 | └── laradock │ ├── .env │ └── docker-compose.ymlLaravelプロジェクトの雛形を生成する
この状態で開発(&実行)環境はコンテナ内(ゲスト側)に生成されましたので、Laravelのプロジェクトを生成するためにコンテナ内へ入ります。
開発作業環境(workspace)
docker ps
でworkspaceがついたコンテナを探します。$ docker ps A*********** fugalaradock_nginx B*********** fugalaradock_php-fpm C*********** fugalaradock_workspace # <--- これ D*********** fugalaradock_mysql E*********** docker:dindコンテナに入ります。
$ docker exec -it C*********** bash root@C***********:/var/www# # プロンプトが出てくればOKcomposerを使ってLaravelプロジェクトを作成します。
# composer create-project laravel/laravel . # <-- ホスト側のfuga/app内に作る : : Package manifest generated successfully. > @php artisan key:generate --ansi Application key set successfully.これでLaravelの雛形が/var/www/app内に生成され
http://localhost:8099
で以下のページが表示されれば成功です。
別プロジェクト(moge)を作る
注意する部分まで。
$ mkdir moge;cd $_ $ git clone https://github.com/Laradock/laradock.git $ cp env-example .env $ vi .env
.env
の設定を他のプロジェクトと重ならないように変更しておきます。APP_CODE_PATH_HOST=../app/ DATA_PATH_HOST=../data COMPOSE_PROJECT_NAME=mogelaradock # ポイント! 一意にしてコンテナ名のバッティングを防ぐ! NGINX_HOST_HTTP_PORT=8090 NGINX_HOST_HTTPS_PORT=4490 APACHE_HOST_HTTP_PORT=8090 APACHE_HOST_HTTPS_PORT=4490 WORKSPACE_SSH_PORT=2290 MYSQL_PORT=3390あとはプロジェクトの雛形を生成して終わり!
$ docker ps $ docker exec -it {containerID} bash root@{containerID}:/var/www# # composer create-project laravel:laravel .