20190708のlaravelに関する記事は12件です。

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-case

implodeは指定の文字列で連結
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;

インスタンスを生成しているのですなぁ。

これは、自分でも使えそうなので、覚えておく。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

nginx + Laravel でホーム以外のページの404エラー解決

はじめに

前回はnginx + MySQL + Laravelの環境構築をしてトップページの表示まで行いました。さて、もりもり開発始めるぞー!と思った が矢先、、 ログイン認証してみようと思ったら404エラー。なんでや、、と頭を抱えました。ルーティングに何もおかしいところはないし、どうしたものか、と思ったのですが原因はlaravel側ではなくnginxの設定だったようです。記事書いた時にnginxわかんないなぁ〜って放置したのはダメだったようです。わからないとこはちゃんと潰しておこう。。。。

修正前の元のファイル

さて、元のnginxのファイルであるdefault.confを見てみます。

default.conf
server {
  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.conf
server {
  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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

参考

Laravel Document

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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=HogesTableSeeder
testapp_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

参考

Laravel Document

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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:reset

migrationファイルの作成

以下のコマンドを実行してマイグレーションファイルを作成します。指定するファイル名を「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');
    }
}

参考

Laravel Document

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Laravel][Homestead] 使用するデータベースをPostgreSQLに変更してみる

データベースの初期設定がMySQLになっているので、安心のPostgreSQLに変更してみる。

PostgreSQLにログインしてみる

パスワードのデフォルトは「secret」。

$ psql -hlocalhost -Uhomestead

UTF8指定してデータベースを作成してみる

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
...

参考

LaravelのHomestead環境でPostgreSQL初期設定を行う

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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)

参考

Laravel Document

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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)

参考

Laravel Document

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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 ... ルーティングを格納する

参考

初めてのLARAVEL 5.6 : (1) ページの表示フロー

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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.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 ... ルーティングを格納する

参考

初めてのLARAVEL 5.6 : (1) ページの表示フロー

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.1

VirtualBoxのインストール

公式サイトからインストーラをダウンロードします。インストーラを実行し、画面の指示に従ってインストールします。

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 Homestead

Homesteadの初期化

以下のコマンドでHomesteadの初期化をします。

$ cd ~/Homestead
$ bash init.sh
Homestead initialized!

SSH鍵ファイルの作成

SSH鍵がない場合は作成します。パスフレーズの有無は自由です。

$ cd
$ mkdir .ssh && cd $_
$ ssh-keygen -t rsa

Homesteadの設定

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 code

hostsの設定をします。hostsファイルに以下の設定を追加し、ホスト名(homestead.test)でアクセスできるようにします。

C:\Windows\System32\drivers\etc\hosts

192.168.10.10   homestead.test

Vagrantの起動

$ cd ~/Homestead
$ vagrant up

使いそうなvagrantのコマンドは次の通りです。

コマンド 説明
vagrant start 仮想マシンを起動する
vagrant halt 仮想マシンを停止する
vagrant reload --provision Homestead.yamlの変更を反映させる
vagrant status 仮想マシンのステータスを表示する
vagrant destroy 仮想マシンを破棄する
vagrant ssh 仮想マシンにssh接続する

Laravelプロジェクトの作成

仮想環境へログインします。

$ vagrant ssh

composerを使用して、以下のコマンドでプロジェクトを作成します。

$ 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対応』ソシム
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【複数プロジェクト対応】Laravel開発環境をDockerを使って用意する

Laravel

http://laravel.jp/

Vagrantを使った開発環境 Homestead

Vagrant仮想環境を使って開発をする場合はこちらを参照してください。
https://readouble.com/laravel/5.8/ja/homestead.html

Dockerを使った開発環境 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.yml

docker-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.yml

Laravelプロジェクトの雛形を生成する

この状態で開発(&実行)環境はコンテナ内(ゲスト側)に生成されましたので、Laravelのプロジェクトを生成するためにコンテナ内へ入ります。

開発作業環境(workspace)

docker psworkspaceがついたコンテナを探します。

$ 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#   # プロンプトが出てくればOK

composerを使って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で以下のページが表示されれば成功です。
laravel.png

別プロジェクト(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 .
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む