20190716のlaravelに関する記事は9件です。

AWS ELBでSSL化した際にLaravelのメール認証(EmailVerification)ができなくなった話

起きたこと

ELBでSSL化を行った際に、Laraveのメール認証が動かなくなってしまった。

エラーを探ってるとこんなメッセージが
This request has been blocked;. the content must be served over HTTPS.

結論

ここに記載してあるとおり
TLS/SSL証明を行うロードバランサの裏でアプリケーションが実行されている場合は別で対応が必要みたいです。

Tip!! AWS Elastic Load Balancingを使用している場合、$headersの値は
Request::HEADER_X_FORWARDED_AWS_ELBに設定する必要があります。$headersで使用する
内容の詳細は、Symfonyのtrusting proxiesドキュメントを参照してください。

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

Laravelのマイグレーション履歴をリセットして、全テーブルを作り直す手順

マイグレーションやロールバックを繰り返しているうちに、テーブルやカラムの構成が混乱してきたので、初めから全テーブルを作り直したい、マイグレーションの履歴も削除したい、というような場面で。

手順

  1. (必要であれば)以下バックアップをとっておく
    • 既存のテーブル
    • database/migrations配下の各マイグレーションファイル
  2. 既存のテーブルを全て削除する
  3. database/migrations配下のマイグレーションファイルを全て削除
  4. 次のコマンドでバージョン管理用migrationテーブルを作成
    • php artisan migrate:install
  5. (バックアップ済があれば)migrations/配下にファイルを再び配置
  6. migrate実行
    • php artisan migrate

以上でテーブルとマイグレーションが初期化される。

上のようなリセット作業を減らすためにも、マイグレーションファイルはロールバックすることを考慮して、upメソッドだけではなく、downメソッドも適切に記述しよう。

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

MacでLaravel5.8導入 導入の下準備_仮想環境構築

前提

下記のページ(公式ではない?)が非常によくできてるので読めばだいたいわかる
https://readouble.com/

環境:Mac
VirtualBox, Vagrant導入済み

導入前の下準備

仮想環境の設定

Homestead というVagrant仮想環境を使うと非常に都合が良いらしい

# Vagrantに、HomesteadのBoxイメージをインストール
$ vagrant box add laravel/homestead

# homeディレクトリにhomesteadのリポジトリをクローン(自分のLaravelの全プロジェクトをホストしておくHomestead Boxを用意するためらしい)
$ git clone https://github.com/laravel/homestead.git ~/Homestead

# 最新のmasterではなく安定版のreleaseブランチに変更
$ cd ~/Homestead
$ git checkout release

# 設定ファイルを作成(Homestead.yaml)
$ bash init.sh

Homestead.yamlの設定

下記以外は特殊な設定がなければ初期設定のままでOK

# 仮想環境に同期したいローカル環境のディレクトリを記載する
# map: ローカル開発環境側  to: 仮想環境側
folders:
    - map: ~/myProject/laravelTest
      to: /home/vagrant/laravelTest

ホスト名の解決

hostsファイルに下記を追加する。192.168.10.10は、IPアドレスの初期値
192.168.10.10 homestead.test

Vagrantの起動

Homesteadの設定が一通り終わったので、Vagrantを起動する。

# Homesteadディレクトリで
$ vagrant up

ブラウザで、homestead.testにアクセスして表示されればOK

仮想環境へのSSH接続

# Homesteadディレクトリで
$ vagrant ssh

アクセスが成功し、ホームディレクトリに同期させたかったディレクトリ, ファイルがあればOK
Homesteadディレクトリ以外からもssh接続できるようにするためには下記を.bash_profileに追加する。

function homestead() {
    ( cd ~/Homestead && vagrant $* )
}

これで他のディレクトリからも
$ homestead ssh
でssh接続できるようになる。(他のvagrantコマンドも)

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

MacでLaravel5.8導入 + 仮想環境構築

前提

下記のページ(公式ではない?)が非常によくできてるので読めばだいたいわかる
https://readouble.com/

環境:Mac
Homebrew, VirtualBox, Vagrant導入済み

まずはComposerの導入

Homebrewを利用
すぐにバージョン古くなってるのでまずはアップデート確認

# ステータスチェック
$ brew doctor
# 問題があれば極力解決しておく

# アップデート
$ brew update

# アップグレード
$ brew upgrade

# エラーが出てなさそうなら、composerのインストール
$ brew install composer

# composerで、Laravelインストーラをダウンロード
$ composer global require laravel/installer

パスを通してプロジェクト作成

laravelコマンドのパスを通す
.bash_profileに下記を追加
export PATH=$PATH:~/.composer/vendor/bin

プロジェクトを作成したい場所に移動してnewコマンド実行

$ cd ~/myProject
$ laravel new laravelTest

これでいったんプロジェクトの作成は完了。

仮想環境の設定

Homestead というVagrant仮想環境を使うと非常に都合が良いらしい

# Vagrantに、HomesteadのBoxイメージをインストール
$ vagrant box add laravel/homestead

# homeディレクトリにhomesteadのリポジトリをクローン(自分のLaravelの全プロジェクトをホストしておくHomestead Boxを用意するためらしい)
$ git clone https://github.com/laravel/homestead.git ~/Homestead

# 最新のmasterではなく安定版のreleaseブランチに変更
$ cd ~/Homestead
$ git checkout release

# 設定ファイルを作成(Homestead.yaml)
$ bash init.sh

Homestead.yamlの設定

下記以外は特殊な設定がなければ初期設定のままでOK

Homestead.yaml
# 仮想環境に同期したいローカル環境のディレクトリを記載する
# map: ローカル開発環境側  to: 仮想環境側
folders:
    - map: ~/myProject/laravelTest
      to: /home/vagrant/laravelTest

ホスト名の解決

hostsファイルに下記を追加する。192.168.10.10は、IPアドレスの初期値
192.168.10.10 homestead.test

Vagrantの起動

Homesteadの設定が一通り終わったので、Vagrantを起動する。

# Homesteadディレクトリで
$ vagrant up

ブラウザで、homestead.testにアクセスして表示されればOK

仮想環境へのSSH接続

# Homesteadディレクトリで
$ vagrant ssh

アクセスが成功し、ホームディレクトリに同期させたかったディレクトリ, ファイルがあればOK
Homesteadディレクトリ以外からもssh接続できるようにするためには下記を.bash_profileに追加する。

function homestead() {
    ( cd ~/Homestead && vagrant $* )
}

これで他のディレクトリからも
$ homestead ssh
でssh接続できるようになる。(他のvagrantコマンドも)

おしまい

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

Laravelコレクションのpluck()メソッドを活用しよう

環境

Laravel Framework 5.8
PHP 7.2

やりたいこと

DBからこのようなデータを取得して、idがキー、カラムデータがバリューとなる、配列を作りたくなることがよくある。

    $collection = collect([
        ['id' => 1, 'name' => 'ジャック鈴木', 'company' => 'Five Needs'],
        ['id' => 2, 'name' => 'Umichiko' , 'company' => 'Five Needs']
    ]);

私はこれまで、このようなときarray_column()を利用して配列を生成していた。

  $user_array = array_column($collection->all(),null,"id");

スマートなやり方

Laravelコレクションの機能であるpluck()メソッドを利用することで同様のことがより簡潔に実現できる。

    $collection = collect([
        ['id' => 1, 'name' => 'ジャック鈴木', 'company' => 'Five Needs'],
        ['id' => 2, 'name' => 'Umichiko' , 'company' => 'Five Needs']
    ]);

    /*
     * nameの値だけを取得できる。
     */
    var_dump($collection->pluck("name"));

    //class Illuminate\Support\Collection#331 (1) {
    //  protected $items =>
    //  array(2) {
    //    [0] =>
    //    string(18) "ジャック鈴木"
    //    [1] =>
    //    string(8) "Umichiko"
    //  }
    //}


    /*
     * キーがidでバリューがnameのコレクションを生成
     */
    var_dump($collection->pluck("name", "id"));

    //class Illuminate\Support\Collection#331 (1) {
    //  protected $items =>
    //  array(2) {
    //    [1] =>
    //    string(18) "ジャック鈴木"
    //    [2] =>
    //    string(8) "Umichiko"
    //  }
    //}



    /*
     * キーがidでバリューに全データが入ったコレクションを生成
     */
    var_dump($collection->pluck(null, "id"));

    //class Illuminate\Support\Collection#331 (1) {
    //  protected $items =>
    //  array(2) {
    //    [1] =>
    //    array(3) {
    //      'id' =>
    //      int(1)
    //      'name' =>
    //      string(18) "ジャック鈴木"
    //      'company' =>
    //      string(10) "Five Needs"
    //    }
    //    [2] =>
    //    array(3) {
    //      'id' =>
    //      int(2)
    //      'name' =>
    //      string(8) "Umichiko"
    //      'company' =>
    //      string(10) "Five Needs"
    //    }
    //  }
    //}

    /*
     * array_columnでも同様のことができる
     */
    var_dump(array_column($collection->all(),null,"id"));
    //array(2) {
    //  [1] =>
    //  array(3) {
    //    'id' =>
    //    int(1)
    //    'name' =>
    //    string(18) "ジャック鈴木"
    //    'company' =>
    //    string(10) "Five Needs"
    //  }
    //  [2] =>
    //  array(3) {
    //    'id' =>
    //    int(2)
    //    'name' =>
    //    string(8) "Umichiko"
    //    'company' =>
    //    string(10) "Five Needs"
    //  }
    //}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelのseederを冪等にする

seederを冪等に作成しておかないと、重複してはいけないデータが存在した場合に、2度目の実行時にエラーが発生してしまいます。
そのため、データがなければ作成してすでに存在していれば作成をしないようにするような書き方について調べました。

そもそも冪等とは

wikipediaによると

ある操作を1度行っても複数回行っても同じ効果となることを言う。特に、何回行ってもエラーや不整合の状態が変わらない操作を指す。

firstOrCreateを使う

firstOrCreateを使用することで、データが存在すればそれを取得するし、なければ新しく作成してくれます。

firstOrCreateメソッドは指定されたカラム/値ペアでデータベースレコードを見つけようします。モデルがデータベースで見つからない場合は、最初の引数が表す属性、任意の第2引数があればそれが表す属性も同時に含む、レコードが挿入されます。

firstOrCreateで作成されたのかどうかはwasRecentlyCreatedで判定をする

モデルのインスタンスのwasRecentlyCreated で判定ができます。

// 初回の実行
>>> $user = App\User::firstOrCreate(['name' => 'hoge', 'email' => 'hoge2@hoge.com', 'password' => 'hoge2']);
=> App\User {#2901
     name: "hoge",
     email: "hoge2@hoge.com",
     updated_at: "2019-07-15 23:11:35",
     created_at: "2019-07-15 23:11:35",
     id: 53,
   }
// 作成されたのでtrueになる
>>> $user->wasRecentlyCreated;
=> true
// 再度実行して取得する
>>> $user = App\User::firstOrCreate(['name' => 'hoge', 'email' => 'hoge2@hoge.com', 'password' => 'hoge2']);
=> App\User {#2900
     id: 53,
     name: "hoge",
     email: "hoge2@hoge.com",
     created_at: "2019-07-15 23:11:35",
     updated_at: "2019-07-15 23:11:35",
     stripe_id: null,
     card_brand: null,
     card_last_four: null,
     trial_ends_at: null,
   }
// 作成されていないのでfalseになる
>>> $user->wasRecentlyCreated;
=> false

これらを組み合わせてseederを作成する

一部分ですが、複数回実行するとデータが重複してエラーになる箇所は、firstOrCreate で作成をして、wasRecentlyCreated がtrueの場合のみそれにひもづくデータを作成するようにすれば、何度実行しても同じ結果となります。

$user = User::firstOrCreate(['name' => 'hoge']);
// 今回作成された場合にはtrueになる
if ($user->wasRecentlyCreated) {
  // userにひもづくデータをここで作成する
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【GCE】Dokku に Laravel 環境を作る

Dokku のお手軽さが楽しくなってしまい、 Laravel も Dokku で運用したくなったのでメモ

Laravel プロジェクトのインストールと前準備

Laravel のインストール

composer のインストールについては「Laravel 4.2 Laravelクイックスタート」をみてください。

composer を使って Laravel をインストールする

bash
composer create-project laravel/laravel <プロジェクト名> --prefer-dist

APP_KEY の作成

bash
cd <プロジェクト名> # プロジェクトディレクトリに移動
php artisan key:generate 

/<プロジェクトディレクトリ>/.env に記述されている base64: から始まるキーをコピーしておく

Dokku をさわる

GCE に接続する

ssh で GCE に接続する

bash
ssh -i <PATH_TO_PRIVATE_KEY> <USERNAME>@<EXTERNAL_IP_ADDRESS>

もしくは、 gcloud を利用している場合は
「インスタンス>リモートアクセス>gcloudコマンドを表示」からコピペして接続

GCE に Dokku アプリを作成する

laravel-dokku-app って名前のプロジェクトを作ることにする

bash
dokku apps:create laravel-dokku-app

APP_KEY を Dokku に設定する

bash
dokku config:set laravel-dokku-app <APP_KEY>

APP_KEY => 「APP_KEY の作成」の項目でコピーしたやつをコピペする

Procfile と BUILDPACK_URL を設定する

Dokku は何も設定しないと Node.js プロジェクトと認識されるらしいので、
PHP を扱うために ProcfileBUILDPACK_URL とかいうやつの設定をする

Procfile の作成

ローカル環境の Laravel プロジェクトのルートでやる

bash
echo 'web: vendor/bin/heroku-php-apache2 public/' >> Procfile

BUILDPACK_URL の設定

GCE サーバー内でやる

bash
dokku config:set laravel-dokku-app BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-php

Laravel を Dokku にデプロイする

bash
git init
git add .
git commit -m "first deploy"
git remote add dokku dokku@<外部IPアドレス>:laravel-dokku-app
git push dokku master

外部IPアドレス => インスタンス>ネットワークインターフェース>外部 IPの下にある数字をコピペ

おわり

メモ: ポートを指定する場合はこうする

bash
git remote add dokku ssh://dokku@<外部IPアドレス>:<ポート番号>/laravel-dokku-app

参考

How to deploy Laravel app on Dokku
https://jiegersblog.blogspot.com/2017/06/how-to-deploy-laravel-app-on-dokku.html

setting permissions problem
https://github.com/dokku/dokku/issues/353

[Laravel5.5] APP_KEY の行方を追う
https://qiita.com/yk2220s/items/dcbf54c6d1f33a0cb06f

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

Laravel[業務効率化]自動migrationファイル作成ツールをつくってみた話

作成するにあたっての動機

今まで、Laravelを使ったプロジェクトにかかわらせていただくことがあり、DB設計を終えた後に、sqlファイルやddlファイルを自動で作ってくれるものはあるのに、それを元にマイグレーションファイルを自動で作ってくれるものがないので、大変だぁと思い、取り組んでみました。

こうしたほうがいい(特にカプセル化・命名などなど)などの意見をぜひほしいです。新米のため、すごく助かります。もしよろしければ、お願いいたします。

最終目的

すでに作成されているテーブルからマイグレーションファイルを自動で作れるようにします。

準備

プロジェクト作成

コマンド
composer create-project --prefer-dist laravel/laravel autoCreateMigrationFileSystem

テーブル作成

今回は、laravelのmigrationファイルを作成・実行し、テーブルを作り、そこから同じファイルが作成されるかをテストします。

実際は複数テーブルがあるため、2つのテーブルを用意する。

・applesテーブル

・lemonsテーブル

コマンド
/var/www# php artisan make:migration create_apples_table
Created Migration: 2019_07_15_133234_create_apples_table
/var/www# php artisan make:migration create_lemons_table
Created Migration: 2019_07_15_133511_create_lemons_table

僕が今回参加するプロジェクトで使うカラムタイプが補えればいいので、それだけ洗い出す(新たに必要なカラムタイプは後から加えていく)

今回使うカラムタイプ

  • bigint(20)のauto_increment
  • bigint(20)
  • bigint(20) nullable
  • bigint(20) default(0)
  • varchar(255)
  • timestamp (created_atとupdated_atで使用する)
  • int(11)
  • tinyint(4)
  • text
  • date
  • datetime

これらを二つのマイグレーションファイルに記述します。

CreateApplesTable.php
<?php

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

class CreateApplesTable extends Migration
{
    public function up()
    {
        Schema::create('apples', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('a');
            $table->bigInteger('b')->nullable();
            $table->bigInteger('c')->default(0);
            $table->string('d', 255);
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('apples');
    }
}
CreateLemonsTable.php
<?php

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

class CreateLemonsTable extends Migration
{
    public function up()
    {
        Schema::create('lemons', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('e');
            $table->tinyInteger('f');
            $table->text('g');
            $table->date('h');
            $table->dateTime('i');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('lemons');
    }
}

コマンド
/var/www# php artisan migrate
Migration table created successfully.
Migrating: 2019_07_15_133234_create_apples_table
Migrated:  2019_07_15_133234_create_apples_table
Migrating: 2019_07_15_133511_create_lemons_table
Migrated:  2019_07_15_133511_create_lemons_table

これで準備が完了しました。

実装

今回作るファイル(4ファイル)
- app/Repositories/Repository.php
- views/create_table_stub.blade.php
- config/column_type.php
- app/Console/Commands/MakeMigrationFile.php

app/Repositories/Repository.php(カラム情報を取得するよう)

Repository.php
<?php
namespace App\Repositories;

use Illuminate\Support\Facades\DB;


class Repository
{
    //それぞれのテーブルごとのカラム情報を取得する
    public static function getTableColumnsList()
    {
        $tableColumnsList = [];

        $tableNameList = self::getTableNameList();

        foreach ($tableNameList as $tableName){
            $tableColumnsList[$tableName] = DB::select('show columns from '. $tableName);
        }

        return $tableColumnsList;
    }

    //テーブルの名前を一覧取得する(migrationsテーブルは必要ないので、取得したものからはずす)
    private static function getTableNameList()
    {
        return collect(DB::select('show tables'))
            ->keyBy('Tables_in_'. env('DB_DATABASE'))
            ->forget('migrations')
            ->keys();
    }
}

getTableNameListの実行結果

Screenshot_1.png

getTableColumnsListの実行結果(applesテーブルの中身の写真だけ(長いので・・・・)

Screenshot_2.png
Screenshot_3.png

ファイルを作る用のフォーマットを作成する(views/create_table_stub.blade.php)

create_table_stub.blade.phpをview配下に作成する。

create_table_stub.blade.php
@php $phpTag = '<?php' @endphp
{!! $phpTag !!}
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class {{$className}} extends Migration
{
    public function up()
    {
        Schema::create('{{$tableName}}', function (Blueprint $table) {
@foreach($defineColumnList as $defineColumn)
            $table->{!! $defineColumn !!};
@endforeach
        });
    }

    public function down()
    {
        Schema::dropIfExists('{{$tableName}}');
    }
}

@foreachを一番左にしているのは、ファイルを作成したときにインデントを整えるためです。
{{}}ではなく、{!! !!}を使っているところは、エスケープされると都合がよくないため、こうしています。

どのカラムタイプならどのマイグレーション用のメソッドを使うか決めておく(config/column_type.php)

今回使用する必要があるのだけ、定義しました。(後々必要なものは足して、完成度を上げていく)

column_type.php
<?php
return [
    'auto_increment' => [
        'bigint(20) unsigned' => 'bigIncrements'
    ],

    'bigint(20)' => 'bigInteger',
    'int(11)'    => 'integer',
    'tinyint(4)' => 'tinyInteger',
    'date'       => 'date',
    'datetime'   => 'dateTime',
    'text'       => 'text',

    //サイズ考慮する必要のあるタイプ
    'length' => [
        'varchar' => 'string'
    ]
];

auto_incrementは特殊パターンとして、またサイズを考量すべきものは、length配列の中に入れています。
今後、min maxや from toを使用するメソッドを使いたい場合はその時に強化します。
created_atとupdated_atのtimestampsメソッドは後々処理で追加します。
ちなみに、公式に使用できるカラムタイプが書いてあるので、そこを参考にしました

コマンド
/var/www# php artisan config:clear

コマンドを打ち、設定を反映させました。

コマンドで自動作成が動くようにする。(app/Console/Commands/MakeMigrationFile.php)

コマンドを打ち、ファイルを作成します。

コマンド
/var/www# php artisan make:command MakeMigrationFile
Console command created successfully.
MakeMigrationFile.php
<?php

namespace App\Console\Commands;

use App\Repositories\Repository;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;

class MakeMigrationFile extends Command
{
    protected $signature   = 'make:migration-file';
    protected $description = 'マイグレーション用ファイルを自動作成';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $configColumnType = config('column_type');

        $tableColumnsList = Repository::getTableColumnsList();
        foreach ($tableColumnsList as $tableName => $columnList) {

            $tempDefineColumnList = [];
            foreach ($columnList as $index => $column) {

                if ($column->Extra === 'auto_increment') {
                    $tempDefineColumnList[$index] = "{$configColumnType['auto_increment'][$column->Type]}('{$column->Field}')";
                    continue;
                }

                if (isset($configColumnType[$column->Type])) {
                    $tempDefineColumnList[$index] = "{$configColumnType[$column->Type]}('{$column->Field}')";

                    if ($column->Null === 'YES')      $tempDefineColumnList[$index] .= '->nullable()';
                    if (strlen($column->Default) > 0) $tempDefineColumnList[$index] .= "->default({$column->Default})";
                    continue;
                }

                $tempColumnType = preg_replace('/(\(|\)|[0-9])/', '', $column->Type);
                if (isset($configColumnType['length'][$tempColumnType])) {

                    $tempLength = preg_replace('/[^0-9]/', '', $column->Type);
                    $tempDefineColumnList[$index] = "{$configColumnType['length'][$tempColumnType]}('{$column->Field}', {$tempLength})";
                    continue;
                }

                //(特殊パターン)created_atとupdated_atのtimestampsメソッド
                if ($column->Field === 'created_at' && isset($columnList[$index + 1]) && $columnList[$index + 1]->Field === 'updated_at') {
                    $tempDefineColumnList[$index] = 'timestamps()';
                    continue;
                }
            }

            $tempClassName  = 'Create'. Str::studly($tableName). 'Table';

            $tempContent = view('create_table_stub', [
                'className'        => $tempClassName,
                'tableName'        => $tableName,
                'defineColumnList' => $tempDefineColumnList
            ])->render();

            $fileNamePrefix = Carbon::now()->format('Y_m_d_His');
            $tempFilePath   = database_path("migrations/{$fileNamePrefix}_create_{$tableName}_table.php");

            File::put($tempFilePath, $tempContent);
        }
    }
}

こんな時間かぁー、自分の実力だとこのあとの改造(カプセル化やもっと短く書けるかなどを考える)と寝る時間が無くなってしまうので(あした会社のため)、とりあえず、要件は満たしたのでこれで、実行する。(handle内のカプセル化や足りない処理はまた今度修正)

コマンド
php artisan make:migration-file

中身が同じマイグレーションファイルができました。いったん完了。

問題点

  • MakeMigrationFile.phpのhandleメソッドの中身をカプセル化する
  • lengthのほうのnullableとdefaultが考慮されていないため、その処理を加える。(その場合stringはデフォルト値をクォテーションで囲む)
  • 命名ももっといいのがある

まとめ

意外と要件を満たすだけならさくっとできました。よかった明日会社で使ってみよ。
こうしたほうがいい(特にカプセル化・命名などなど)などの意見をぜひほしいです。新米のため、すごく助かります。もしよろしければ、お願いいたします。

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

laravelを使用したjsonを返すAPIの作り方

Laravelのリソースクラスは、モデルやモデルコレクションを記述しやすく簡単に、JSONへと変換してくれます。

↑公式から引用

モデル作成

php artisan make:model UserSample

モデル記述

  • $fillableに指定したカラムのみ、create()やfill()、update()で値が代入されます。

  • モデルから変換する配列やJSONに、パスワードのような属性を含めたくない場合があります。それにはモデルの$hiddenプロパティに定義を追加してください。

/api/app/UserSample.php
namespace App;

use \App\UserSample;
use Illuminate\Database\Eloquent\Model;


class UserSample extends Model
{

    protected $table = 'UserSample';
//    上記コードでテーブル指定
    protected $fillable = [
        'name', 'email', 'password',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

}

 コントローラー作成

php artisan make:resource UserSampleResource

コントローラー記述

/api/app/Http/Resources/UserSampleResource.php
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class UserSample extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return parent::toArray($request);
    }
}

route記述

/api/routes/api.php
<?php

use App\UserSample;
use Illuminate\Http\Request;
use App\Http\Resources\UserSampleResource;

Route::get('/user', function () {
    return new UserSampleResource(UserSample::all());
});

マイグレーション作成

php artisan make:migration UserSample

マイグレーション記述

/api/database/migrations/2019_07_15_042644_UserSample.php
<?php

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

class UserSample extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('UserSample', function (Blueprint $table) {
            $table->increments('id')->index();
            $table->string('name')->nullable();
            $table->string('email')->nullable();
            $table->string('password')->nullable();;
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
    }
}

マイグレーション実行

php artisan migrate

実行する

ローカルにサーバーを立てる

php artisan serve

下記をGETする
http://localhost:8000/api/userSample

下記のようにjson形式でデータが返ってくるAPIの完成

{"data":[]}

次回はuserを作成するAPI開発について書く。

サンプルコード
https://github.com/taichi0514/laravel_sample_api-

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