20200123のlaravelに関する記事は11件です。

LaravelでUncaught domexception: failed to execute '***' on 'element': ',' is not a valid attribute name.を吐き出したときに確認したこと

Laravelにてアプリを作成していたところコンソールに下記のようなエラーが発生

Uncaught domexception: failed to execute 'setattribute' on 'element': ',' is not a valid attribute name.

簡単に訳すと「属性名に','(カンマ)は使えないから'setattribute'は実行できないよ!」
と怒られてしまってます。

考えたこと

コンソールのエラーだからJavaScriptのファイルに不備があるのか?
スクリーンショット 2020-01-23 午後5.36.59.png

右側のapp.js:41954から該当エラー個所をみてみるが何もおかしいところはなさそう。
そもそも","(カンマ)がその行にない...

「属性名」に異常?つまりviewファイル側におかしいところがあるのか?

index.blade.php
      <li>
        <a href="{{ action('WordsController@show', $word )}}">{{ $word->en }}</a>
        <a href="">{{ $word->ja }}</a>
        <a href="#", data-id="{{ $word->id }}">[×]</a>
        <form method="post", action=" {{ url('/words', $word->id) }} " id="form_{{ $word->id }}" >
        {{ csrf_field() }}
        {{ method_field('delete') }}
        </form>
      </li>

よーくみると

4行目のhref="#"の後ろのカンマ...
5行目のmethod="post"の後ろのカンマ...

いりません!!!

スクリーンショット 2020-01-23 午後5.36.17.png

これを消したらエラーも消えました。

おわりに

認証機能を追加するべく、Laravel6のuiパッケージを入れ込んでからこのエラーがで始めたので、色々と考え込んでしまったけれど、結局は小さなミスでした。
直前までUIも問題なく動いていたのも時間を食ってしまいました。
しかしながら探しても日本語の記事が全然ない...
同じようなことが起こった方と自分への忘備録として残しておきます。

参考リンク

https://github.com/OnsenUI/OnsenUI/issues/169

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

Laravel で カラムの型を変更したらエラーが出たので対処法

やりたいこと

テーブルのカラムの型を
string(varchar)からintgerにしたい

公式に従いdoctrine/dbalを入れる
変えるテーブルを指定し、対象カラムを変更しchange()

 public function up()
 {
     Schema::table('users', function (Blueprint $table) {
         $table->unsignedInteger('hoge')->length(7)->nullable(true)->default(null)->change();
     });
 }

しかしmigrateすると下記エラーが

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CHARACTER SET utf8mb4 DEFAULT NULL
COLLATE
utf8mb4_unicode_ci

対処法

doctrine/dbalの最新である2.10で追加されたバグが原因らしい

v.2.9.3にすると治りました

composer require doctrine/dbal:2.9.3

php artisan migrate

参考

https://stackoverflow.com/questions/58976719/how-to-convert-string-column-type-to-integer-using-laravel-migration

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

Laravel で カラムの型を変更したらエラーが出たので対処方

やりたいこと

テーブルのカラムの型を
string(varchar)からintgerにしたい

公式に従いdoctrine/dbalを入れる
変えるテーブルを指定し、対象カラムを変更しchange()

 public function up()
 {
     Schema::table('users', function (Blueprint $table) {
         $table->unsignedInteger('hoge')->length(7)->nullable(true)->default(null)->change();
     });
 }

しかしmigrateすると下記エラーが

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CHARACTER SET utf8mb4 DEFAULT NULL
COLLATE
utf8mb4_unicode_ci

対処法

doctrine/dbalの最新である2.10で追加されたバグが原因らしい

v.2.9.3にすると治りました

composer require doctrine/dbal:2.9.3

php artisan migrate

参考

https://stackoverflow.com/questions/58976719/how-to-convert-string-column-type-to-integer-using-laravel-migration

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

Laravel5.8で都道府県/市区町村データをAPIを使ってmigration/seederで一括紐付け登録

たまに必要になる都道府県と市区町村のマスタデータ登録

APIを使ってmigrationとseederだけで一括紐付け登録が出来るようにしました。

メリット

  • コピペで動く
  • APIで市区町村情報を取得するので実行するたびに最新情報ゲッツ
  • 都道府県コードをIDに変換してるが、都道府県コードをprimary_keyにすることも可能(こっちのが良いかも)

概要

都道府県と市区町村を紐づけてDBにマスタとして登録したかったのですが、
Excelが嫌いなのでプログラムで書くことにした。

やりたいこと

親テーブルの都道府県に子テーブルの市区町村を紐づけてマスタとして使いたかった。

Qiitaに都道府県とか一括で登録するライブラリ作ってる方がいましたが、
とりあえず今回は自作しました。
時間ない方はどうぞ
日本の住所関連のマスターデータをライブラリにしてみた

Migration作成

まずはMigrationから作っていきます。

ターミナルを開いてファイルを作成!

php artisan make:migation create_prefectures_table
php artisan make:migation create_cities_table

都道府県(prefectures)

とりあえずup()だけ

2020_01_01_123456_create_prerfectures_table.php
    public function up()
    {
        Schema::create('prefectures', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name')->comment('都道府県名');
        });
    }

市区町(cities)

こっちもup()だけ
prefecturesのidとcitiesのprefecture_idで外部キーを設定してます。

2020_01_01_123456_create_cities_table.php
    public function up()
    {
            $table->increments('id');
            $table->unsignedInteger('prefecture_id');
            $table->string('city_code')->comment('市区町村コード');
            $table->string('name')->comment('市区町村名');

            $table->index('prefecture_id');
            $table->index('name');

            $table->foreign('prefecture_id')
            ->references('id')
            ->on('prefectures')
            ->onDelete('cascade')
            ->onUpdate('cascade');
    }

外部APIを使うので必要なライブラリをインストール

全国地方公共団体というところが提供しているAPIに市区町村コードが入ったものがあったのでそれを使う。
外部APIなのでライブラリをインストールする

Guzzleをインストール

PHPで外部APIを叩けるモジュールであるGuzzleをインストール

ターミナルを開いて...

composer require guzzlehttp/guzzle

これで準備OK

Seederで登録

Seederファイルを作成しましょう。

またターミナル開いて...

php artisan make:seed PrefecturesTableSeeder
php artisan make:seed CitiesTableSeeder

都道府県(prefectures)

ここは数が少ないので配列で順次保存してマスタを作成

※重要 今回idを都道府県コードに見立てて使っていくので順番ずれたら終わりです。
下記の配列通りにしてください。

それか別で都道府県コード持ってもいいです

PrefecturesTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class PrefecturesTableSeeder extends Seeder
{
    private $prefectures = [
        "北海道",
        "青森県",
        "岩手県",
        "宮城県",
        "秋田県",
        "山形県",
        "福島県",
        "茨城県",
        "栃木県",
        "群馬県",
        "埼玉県",
        "千葉県",
        "東京都",
        "神奈川県",
        "新潟県",
        "富山県",
        "石川県",
        "福井県",
        "山梨県",
        "長野県",
        "岐阜県",
        "静岡県",
        "愛知県",
        "三重県",
        "滋賀県",
        "京都府",
        "大阪府",
        "兵庫県",
        "奈良県",
        "和歌山県",
        "鳥取県",
        "島根県",
        "岡山県",
        "広島県",
        "山口県",
        "徳島県",
        "香川県",
        "愛媛県",
        "高知県",
        "福岡県",
        "佐賀県",
        "長崎県",
        "熊本県",
        "大分県",
        "宮崎県",
        "鹿児島県",
        "沖縄県"
    ];

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        foreach ($this->prefectures as $prefecture) {
            DB::table("prefectures")->insert([
                "name" => $prefecture
            ]);
        }
    }
}

市区町(cities)

本題の市区町村マスタの登録です。

CitiesTableSeeder.php
<?php

use Illuminate\Database\Seeder;
use GuzzleHttp\Client;
use App\Prefecture;
use App\City;

class CitiesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run(Client $client, Prefecture $prefecture, City $city)
    {
        // 都道府県取得
        $prefectures = $prefecture->all();

        foreach ($prefectures->pluck('id') as $prefecture_id) {
            // 外部API全国地方公共団体コード
            $api = 'https://www.land.mlit.go.jp/webland/api/CitySearch?area=' .str_pad($prefecture_id, 2, 0, STR_PAD_LEFT);
            $respone_datas = $client->request('GET', $api);
            $respone_bodys = json_decode($respone_datas->getBody()->getContents(), true);

            // APIのステータスがOKなら実行
            if ($respone_bodys['status'] === 'OK') {
                foreach ($respone_bodys['data'] as $respone_body) {
                    // 都道府県の外部キーを指定して市区町村を登録
                    $city->create([
                        'prefecture_id' => $prefecture_id,
                        'city_code'     => $respone_body['id'],
                        'name'          => $respone_body['name']
                    ]);
                }
            }
        }
    }
}

あとはDatabasesSeederに登録

DatabasesSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call([
            PrefecturesTableSeeder::class,
            CitiesTableSeeder::class
        ]);
    }
}

またターミナルを開いてmigrationとseederを実行!!

php artisan migrate --seed

ちなみにテストはしてないので悪しからず
終わり

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

Laravel5.8で都道府県データと市区町村データを紐づけてDBに保存(一回しか使わない)

一回しか使わないけど30分くらいで出来そうだったので簡単に作ってみた。

概要

都道府県と市区町村を紐づけてDBにマスタとして登録したかったのですが、
Excelが嫌いなのでプログラムで書くことにした。

やりたいこと

親テーブルの都道府県に子テーブルの市区町村を紐づけてマスタとして使いたかった。

Qiitaに都道府県とか一括で登録するライブラリ作ってる方がいましたが、
とりあえず今回は自作しました。
時間ない方はどうぞ
日本の住所関連のマスターデータをライブラリにしてみた

Migration作成

まずはMigrationから作っていきます。

ターミナルを開いてファイルを作成!

php artisan make:migation create_prefectures_table
php artisan make:migation create_cities_table

都道府県(prefectures)

とりあえずup()だけ

2020_01_01_123456_create_prerfectures_table.php
    public function up()
    {
        Schema::create('prefectures', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name')->comment('都道府県名');
        });
    }

市区町(cities)

こっちもup()だけ
prefecturesのidとcitiesのprefecture_idで外部キーを設定してます。

2020_01_01_123456_create_cities_table.php
    public function up()
    {
            $table->increments('id');
            $table->unsignedInteger('prefecture_id');
            $table->string('city_code')->comment('市区町村コード');
            $table->string('name')->comment('市区町村名');

            $table->index('prefecture_id');
            $table->index('name');

            $table->foreign('prefecture_id')
            ->references('id')
            ->on('prefectures')
            ->onDelete('cascade')
            ->onUpdate('cascade');
    }

外部APIを使うので必要なライブラリをインストール

全国地方公共団体というところが提供しているAPIに市区町村コードが入ったものがあったのでそれを使う。
外部APIなのでライブラリをインストールする

Guzzleをインストール

PHPで外部APIを叩けるモジュールであるGuzzleをインストール

ターミナルを開いて...

composer require guzzlehttp/guzzle

これで準備OK

Seederで登録

Seederファイルを作成しましょう。

またターミナル開いて...

php artisan make:seed PrefecturesTableSeeder
php artisan make:seed CitiesTableSeeder

都道府県(prefectures)

ここは数が少ないので配列で順次保存してマスタを作成

※重要 今回idを都道府県コードに見立てて使っていくので順番ずれたら終わりです。
下記の配列通りにしてください。

それか別で都道府県コード持ってもいいです

PrefecturesTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class PrefecturesTableSeeder extends Seeder
{
    private $prefectures = [
        "北海道",
        "青森県",
        "岩手県",
        "宮城県",
        "秋田県",
        "山形県",
        "福島県",
        "茨城県",
        "栃木県",
        "群馬県",
        "埼玉県",
        "千葉県",
        "東京都",
        "神奈川県",
        "新潟県",
        "富山県",
        "石川県",
        "福井県",
        "山梨県",
        "長野県",
        "岐阜県",
        "静岡県",
        "愛知県",
        "三重県",
        "滋賀県",
        "京都府",
        "大阪府",
        "兵庫県",
        "奈良県",
        "和歌山県",
        "鳥取県",
        "島根県",
        "岡山県",
        "広島県",
        "山口県",
        "徳島県",
        "香川県",
        "愛媛県",
        "高知県",
        "福岡県",
        "佐賀県",
        "長崎県",
        "熊本県",
        "大分県",
        "宮崎県",
        "鹿児島県",
        "沖縄県"
    ];

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        foreach ($this->prefectures as $prefecture) {
            DB::table("prefectures")->insert([
                "name" => $prefecture
            ]);
        }
    }
}

市区町(cities)

本題の市区町村マスタの登録です。

CitiesTableSeeder.php
<?php

use Illuminate\Database\Seeder;
use GuzzleHttp\Client;
use App\Prefecture;
use App\City;

class CitiesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run(Client $client, Prefecture $prefecture, City $city)
    {
        // 都道府県取得
        $prefectures = $prefecture->all();

        foreach ($prefectures->pluck('id') as $prefecture_id) {
            // 外部API全国地方公共団体コード
            $api = 'https://www.land.mlit.go.jp/webland/api/CitySearch?area=' .str_pad($prefecture_id, 2, 0, STR_PAD_LEFT);
            $respone_datas = $client->request('GET', $api);
            $respone_bodys = json_decode($respone_datas->getBody()->getContents(), true);

            // APIのステータスがOKなら実行
            if ($respone_bodys['status'] === 'OK') {
                foreach ($respone_bodys['data'] as $respone_body) {
                    // 都道府県の外部キーを指定して市区町村を登録
                    $city->create([
                        'prefecture_id' => $prefecture_id,
                        'city_code'     => $respone_body['id'],
                        'name'          => $respone_body['name']
                    ]);
                }
            }
        }
    }
}

あとはDatabasesSeederに登録

DatabasesSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call([
            PrefecturesTableSeeder::class,
            CitiesTableSeeder::class
        ]);
    }
}

またターミナルを開いてmigrationとseederを実行!!

php artisan migrate --seed

ちなみにテストはしてないので悪しからず
終わり

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

ローカル開発環境では画像が表示されるのに,VPSのリモートサーバーでは画像が表示されない

chromeDevoolのコンソール
エラーメッセージ

GET ~image_name~.jpeg 403 (Forbidden)

私はあなたが経験しているこの403の問題が共有ホスティングに置かれていると推測しています。

シンボリックリンクを作成するphp artisan storage:link、にはstorage/app/public`フォルダーへの完全な絶対パスが含まれます。これがおそらくサーバーによる403応答の原因です。

解決策は、プロジェクトルートからの相対パスでシンボリックリンクを作成することです

シンボリックリンクに関する操作(linux)の参考

解決 

  • `php artisan storage:link でつくったシンボリックリンクを削除

  • ln -s ../storage/app/public public/storage
    

上記で貼り直し
実行する階層に注意

理由

  • 上に書いてある通りの原因だった
  • 一番上のリンクに一通り原因が書かれてるっぽい
  • autloaderがよみに行かないくらい上から書かれてたから403エラーだったってことでいいのかな
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでブログの本文の続きを「...」にする方法

{!! nl2br(e(str_limit(変数, 制限文字数))) !!}

で制限文字数から先の文章は「...」になります。

解説

nl2br

PHPの改行コードになります。(htmlで言う<br>
https://www.php.net/manual/ja/function.nl2br.php

e()

()内をエスケープさせます。

e関数は、PHPのhtmlspecialchars関数をdouble_encodeオプションにデフォルトでtrueを指定し、実行します。

https://readouble.com/laravel/5.7/ja/helpers.html (「e()」で文字検索してください。)

htmlspecialchars — 特殊文字を HTML エンティティに変換する

https://www.php.net/manual/ja/function.htmlspecialchars.php

エスケープ処理に関してはこちらを参照
https://qiita.com/n_hirai/items/df0a21d2409ee47973e5

まあ要は記号を特殊文字に変換させることです。そうすることによってユーザーが意図せず内部のプログラミングをいじってしまうことを防ぐことができます。
例えば、phpで $this->hensuu の値を取得する処理が書かれている場合、フォームでユーザーが「あああ<<<超えられない壁<<<いいい」とか打ってしまったら内部のプログラミングが<に反応してバグったらやばいからこの処理を使うのです。(もっと良い例えありませんか・・・?)

str_limit(変数、制限文字)

Str::limitでも行けます。繰り返しになってしまいますが、制限文字数から先の文章は「...」になります。
なんか最初からこうなってるみたいです。

str_limit関数は、指定した長さへ文字列を切り詰めます。

https://readouble.com/laravel/5.7/ja/helpers.html (「str_limit」で文字検索してください。)

{!! !!}

これでエスケープから逃れることができます。
通常Laravelで使われるblade構文の {} はhtmlからエスケープしてphp処理を行う際に使われるものでした。
それを「!!」にすることで否定系にしているのでhtmlとして処理されます。
中の処理が終了したらhtmlとして出力させようとしています。

個人的に

なにこれ解説むっず。本当に合ってんのかこれ。
でも使ってみると結構便利なので使ってみてください。何かあればコメントお願いします><

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

Laravel で バリデーションエラー時にJSで動的に増やしたinputの値を保持する

やりたいこと

jsで下記のようなinputをボタンを押したら追加していくというような可変な入力欄のとき
バリデーションエラーが起きたら、行が増えた状態で、それぞれに値が保持されていてほしい

test.blade.php
<div>
    <input type="text" name="hoge[]">
</div>

やりかた

Laravel 6.6で確認しています

バリデーションエラーが起こった時 old('hoge.0')とやれば、一番初めの入力値がとれます。
つまり、indexを指定してあげればその値が、指定しなければ配列そのものが取れます。

old('hoge.0');
old('hoge.1');
// hoge
// hoge2
old('hoge');
// [0 => hoge, 1 => hoge2]

なので、blade側でエラー時にループしてあげれば増えた状態で
入力値を保持できます

test.blade.php
@empty(old('hoge'))
<div>
    <input type="text" name="hoge[]">
</div>
@else
@foreach(old('hoge') as $value)
<div>
    <input type="text" name="hoge[]" value="{{$value}}">
</div>
@endforeach
// ↑↓ どっちでも($loop->indexでも)
@foreach(old('hoge') as $key => $value)
<div>
    <input type="text" name="hoge[]" value="{{old('hoge.{$key}')}}">
</div>
@endforeach
@endempty

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

Laravelをデザインパターンで考察する ~ Builder Pattern ~

デザインパターン

デザインパターンは、いろんな文脈で使われるが、ここでのデザインパターンはGoFのデザインパターン。
その中で今回は、Builder Patternでの実装箇所を取り上げる。
Builder Patternは、デザインパターンの分類、生成・構成・振る舞いのうちの生成に分類される。
生成過程を抽象化したり、コンストラクタの引数が多いとか複雑なときに使うデザインパターン。

基本的な説明は以下のリンクに任せる

[デザインパターン]
https://www.techscore.com/tech/DesignPattern/index.html/

[Builderパターン | PHPデザインパターン]
https://www.ritolab.com/entry/125

Illuminate\Support\Managerクラス

Illuminate\Support\Managerクラスは、Laravelに用意されているBuilder Patternを簡単に利用するための抽象クラス。
インスタンス生成過程を隠蔽し、シンプルに再利用するために継承して使用することができる。

Session, Cache, Auth等で使用されていて、Authの認証方式やSessionのストレージをLaravelで初期状態で使用できるもの以外を使いたい場合は、自前ですべて作成するのではなく、Manageクラスに従って拡張すれば、Laravelの機能をできるだけ残したまま拡張できる。
また、configの変更等最小のステップでほぼコードを書くことなく、設定を変更してSessionを別プロジェクトでも再利用が簡単にできる。

なので機能拡張の際、Managerクラスを継承あるいは引用しているクラスをLaravelが使用している場合、これに乗っかって拡張するのが楽。
新規機能を作る時も、Managerクラスを使えば、Driverを使ったBuilderパターンを容易に使用できる。

最近はLaravelのManagerコンポーネント(AuthManager等)は、継承せずに実装されるように変更されている(処理自体は踏襲されている)。
現在継承して使用されているのはSessionManagerなのでSessionManagerを使用して説明する。

SessionManager

Sessionで使用する機能(Illuminate\Session\Store)を再利用しつつ、使用者は保存先のストレージをconfigを使用して簡単に変更し、Session用のオブジェクト(Illuminate\Session\Store)を生成できるようにというのが、SessionManagerの趣旨
Sessionのストレージの選択肢は、ほぼ確定しているのでそのストレージごとに生成過程を見やすく管理できる。

SessionServiceProviderh

Illuminate\Session\SessionServiceProvider
protected function registerSessionManager()
{
    $this->app->singleton('session', function ($app) {
        return new SessionManager($app);
    });
}

SessionServiceProviderでSessionManagerがコンテナに登録されている
SessionManagerは、あくまで生成過程を抽象化してくれているもので、最終的にはIlluminate\Session\Storeのインスタンスが帰ってくる。

SessionManager

Illuminate\Session\SessionManager
protected function callCustomCreator($driver) //たぶん独自にDriverを登録できるやつ
{
    return $this->buildSession(parent::callCustomCreator($driver));
}

// 既存のDriverメソッドの抜粋
protected function createFileDriver()
{
    return $this->createNativeDriver();
}

protected function createMemcachedDriver()
{
    return $this->createCacheBased('memcached');
}

protected function createDynamodbDriver()
{
    return $this->createCacheBased('dynamodb');
}

// ここで/config/session.phpのdriverをDriverとしてセットしている。
public function getDefaultDriver()
{
    return $this->app['config']['session.driver'];
}

生成過程で必要になる要素を、Driverとして登録する。
ここではSessionを保存するためのStorageをDriverとして登録しておく。
既にFile、memcached、Redis、Dynamoとかいくつか用意されている。
callCustomCreatorで独自のDriverを登録できるはず(試したことない)
各Driverメソッド内で生成過程の差異を吸収する。
Sessionに別のストレージを使いたい場合この仕組みを利用するとLaravelの仕様に乗っかれて便利。

また、configでSessionを設定できるように、$this->app['config']を使用してStoreの生成を抽象化している。

Manager

Illuminate\Support\Manager
protected function createDriver($driver)
{
    if (isset($this->customCreators[$driver])) {
        return $this->callCustomCreator($driver);
    } else {
        $method = 'create'.Str::studly($driver).'Driver';
        if (method_exists($this, $method)) {
            return $this->$method();
        }
    }
    throw new InvalidArgumentException("Driver [$driver] not supported.");
}

// これでdriverメソッドで生成したStoreのメソッドをSessionManagerから直接使用できる
// Session::get('hoge')て感じで(SessionはSessionManagerのファサード)
public function __call($method, $parameters)
{
    return $this->driver()->$method(...$parameters);
}

createDriverにはDefaultDriverが渡されて、
\$method = 'create'.Str::studly($driver).'Driver';
のところでDriverメソッドを確定している。

SessionManagerの効果

SessionManagerにより、SessionのストレージをDATABASEにしたい場合、下記を設定するだけで、SessionファサードでDatabaseストレージに対応したStoreインスタンスが取得できるようになる。

.env
SESSION_DRIVER=database
Artisanコマンド実行
php artisan session:table

php artisan migrate
Session処理
Session::all();

Session::get('hoge');

SMS用のManagerクラスを作ってみる

Smsは外部サービスに処理を投げるので、Driverとして使用するSmsサービスを定義しておく。
今回は、NexmoとTwilioのDriverメソッドを定義する。このメソッドからSms送信用のDriverクラスを定義しておく。なのでSmsManagerが返すインスタンスは、Driverクラス。

App\Components\Sms\SmsManager

SmsManager
<?php

namespace App\Components\Sms;

use Illuminate\Support\Manager;
use Nexmo\Client as NexmoClient; // NexmoのPHPクライアント
use Twilio\Rest\Client as TwilioClient; // TwilioののPHPクライアント
use App\Components\Sms\Drivers\NullDriver; // configに設定がない時用のDriver
use App\Components\Sms\Drivers\NexmoDriver;
use App\Components\Sms\Drivers\TwilioDriver;
use Nexmo\Client\Credentials\Basic as NexmoBasicCredentials; // Nexmoの認証に使うやつ

class SmsManager extends Manager
{
    public function channel($name = null)
    {
        return $this->driver($name);
    }

    public function createNexmoDriver()
    {
        return new NexmoDriver(
            $this->createNexmoClient(),
            $this->app['config']['sms.nexmo.from']
        );
    }

    public function createTwilioDriver()
    {
        return new TwilioDriver(
            $this->createTwilioClient(),
            $this->app['config']['sms.twilio.from']
        );
    }

    protected function createNexmoClient()
    {
        return new NexmoClient(
            new NexmoBasicCredentials(
                $this->app['config']['sms.nexmo.key'],
                $this->app['config']['sms.nexmo.secret']
            )
        );
    }

    protected function createTwilioClient()
    {
        return new TwilioClient(
            $this->app['config']['sms.twilio.key'],
            $this->app['config']['sms.twilio.secret']
        );
    }

    public function createNullDriver()
    {
        return new NullDriver;
    }

    public function getDefaultDriver()
    {
        return $this->app['config']['sms.default'] ?? 'null';
    }
}

createClientで、SMSのapiの初期化をして各DriverClassに渡す。

App\Components\Sms\Drivers\Driver

各外部サービスのDriverクラスの抽象クラス、共通の設定処理を抽象化しておく。

App\Components\Sms\Drivers\Driver
<?php

namespace App\Components\Sms\Drivers;

use Illuminate\Support\Arr;
use App\Components\Sms\Exceptions\SmsException;

abstract class Driver implements
{
    protected $recipient;

    protected $message;

    abstract public function send();

    public function to(string $recipient) // 宛先の設定
    {
        $this->recipient = $recipient;

        return $this; // メソッドチェーンしたいので$thisを返しておく。
    }

    public function content(string $message) // メッセージの設定
    {
        $this->message = $message;

        return $this;
    }
}

App\Components\Sms\Drivers\TwilioDriver

Twilio用のDriverクラス

App\Components\Sms\Drivers\TwilioDriver
<?php

namespace App\Components\Sms\Drivers;

use Twilio\Rest\Client as TwilioClient;

class TwilioDriver extends Driver
{
    /**
     * The Twilio client.
     * 
     * @var \Twilio\Rest\Client
    */
    protected $client;

    /**
     * The phone number this sms should be sent from.
     *
     * @var string
     */
    protected $from;

    /**
     * Create a new Twilio driver instance.
     *
     * @param  \Twilio\Rest\Client  $twilio
     * @param  string  $from
     * @return void
    */
    public function __construct(TwilioClient $twilio, $from)
    {
        $this->client = $twilio;
        $this->from = $from;
    }

    public function send() // 送信処理
    {
        return $this->client->messages->create(
            $this->recipient, [
                'from' => $this->from,
                'body' => trim($this->message)
            ]
        );
    }
}

使ってみる

SMS::channel('twilio')
    ->to($phoneNumber)
    ->content('Using twilio driver to send SMS')
    ->send();

channelメソッドでDriver(TwilioかNexmo)を指定して、各種設定をしてメッセージを送信できて便利。

参考サイト

https://www.slideshare.net/BobbyBouwmann/laravel-design-patterns-86729254
https://itnext.io/building-driver-based-components-in-laravel-5b390dc25bd9
https://github.com/orobogenius/building-driver-based-components

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

大阪でLaravelの勉強会を開催しました。

大阪でLaravel勉強会しました

大阪って東京に比べると本当に勉強会とカンファレンスとか少ないんですよね。。
特にフレームワークのLaravelとかになると月に1回あるかないか(最近は増えてきた)

なので今回は自分で主催して勉強会を開催しよう!と思い、この会を企画した次第です。

Twitterでも沢山投稿してくれました!#大阪Laravel勉強会

発表者テーブル

発表者 内容
ナミザト Laravelワカンネ(゚⊿゚)から「完全に理解した()」までステップアップ
カッポ LaravelとSymfony
Daisuke Laravel5 と Laravel6 の違い -認証編-
ムカエ LaravelでSNSログインを実装
saito_takashi_1117 Laravelをデザインパターンで考察する ~ Builder Pattern ~
ぼんばー MySQLと文字コードの話
flowphantom Laravel4に触れた感想
Yui Amazon LightsailにLaravel環境作ってみた

登壇枠(15min)

Laravelワカンネ(゚⊿゚)から「完全に理解した()」までステップアップ

登壇者 ナミザト

トップバッターは今回主催で筆者のワタクシです。

Laravel始めた時って何となくで動いちゃうので、どういうフローで処理が実行されているのか
分かってない人がほとんどだと思ったので今回の題材は
Laravelのライフサイクル(アクセスしてページが表示されるまでの実行フロー)とLaravelでよく目にする機能について簡単にお話しました!

質問は一つもありませんでした!!多分クソつまらなかった

kyUawwNq (1).jpg

資料

Laravelワカンネ(゚⊿゚)から「完全に理解した()」までステップアップ


LaravelとSymfony

登壇者 カッポ

緊急システム障害対応のため登壇叶わずw

最後の懇親会の串カツ屋でLTしてくれましたw

LaravelとSymfonyのコマンドやディレクトリ構造、プロジェクトを作成する時のフローの違いについて話ししてくれました!

EO41vPOU0AAKd5o.jpeg

資料

次回の登壇で発表するそうです


Laravel5 と Laravel6 の違い -認証編-

登壇者 Daisuke

Larvel5とLaravel6のAuth認証導入手順の違いを実際にLiveコーディングしながら(しゅごい)
説明してくれました!

Laravel5ではターミナルで一発で済んだAuth認証導入

php artisan make:auth

Laravel6では少し手順が増えてます。

ライブラリをインストール

$ composer require laravel/ui

UIのタイプを選択する

vue/react/bootstrapから選択が可能

$ php artisan ui vue --auth

npmインストール&実行

先ほど選択したvue.jsをインストール

$ npm install
$ npm run dev

a5z12-srk8x-min.jpg

資料

Laravel5 と Laravel6 の違い -認証編-

LT枠

LaravelでSNSログインを実装

発表者 ムカエ

SNSログインが簡単に実装できるライブラリ「Socialite」を使ってLaravel×Twitterログインを実装するというお話でした!(半分くらいステマしてたけど

やっぱりトーク慣れしてて、聞いてて面白かったです。

TwitterAPIの申請方法はどうやってやるんですか?という質問があり、
先日たまたまその申請方法を記事にしたらしいのでそちらを参考にしてくださいとの事(サクラかな

TwitterAPI アカウント申請〜許可まで【2020年版】

alejd-zoul2-min.jpg

資料

LaravelでSNSログインを実装

その他ステマ
Laravel6.0(PHP7.3)+MySQL+Laradockで簡易的なECサイトを作る①


Laravelをデザインパターンで考察する ~ Builder Pattern ~

発表者 saito_takashi_1117

デザインパターンとは
クラス設計における定石集で、全部で23パターンあり、それぞれに特徴があります。
GoF(Gang of Four)とは『オブジェクト指向における再利用のためのデザインパターン』の著者である4人の事を指す(絶対メンバー中に中二病おる)

Laravelに用意されているBuilder Patternを簡単に利用するための抽象クラスを考察してみた!という説明をしてくれました!
インスタンス生成過程を隠蔽し、シンプルに再利用するために継承して使用することができる。らしい...

ak9ox-wpzfo-min.jpg

資料

https://qiita.com/7_asupara/items/c76af3c466b5450ef7d2


MySQLと文字コードの話

発表者 ぼんばー

Laravelはあまり触ってないが、MySQLならチョットワカルので文字コードのお話でした!
有名な寿司ビール問題を例にあげて分かりやすく説明してくれました!

寿司ビール問題とは
🍣=🍺のような絵文字は同じ文字扱い
このように文字コードが原因でMySQLにて絵文字が同じ文字列扱いを受ける問題を寿司ビール問題と言うらしい(なぜ)

ちなみにLaravelの標準のcharsetはutf8mb4で、collationはutf8mb4_unicode_ciです

思わず手がロボットのアームになってしまったぼんばーさん

axxdm-wbcm7-min.jpg

ちなみにTwitterでLaravelのDBは何を使ってるか投票を募集するとほとんどがMySQLだったそう(会場でも9.5割くらいMySQLだった)

資料もかなり分かりやすくまとめてくれてるので必見!!

資料

MySQLと文字コードの話


Laravel4に触れた感想

発表者 flowphantom

今は亡きLaravel4について語ってくれました。

Vueのくだりで会場爆笑でしたw
面白いのでぜひ資料覗いてみてください!

また追加でLaravelを完全に意識してであろうPythonのフレームワーク「Masonite」も紹介してくれました!
ディレクトリ構造とか最初の画面とかほぼ同じらしい...!

att1a-a8gdw-min.jpg

資料

Laravel4に触れた感想


Amazon LightsailにLaravel環境作ってみた

発表者 Yui

AWSエンジニアでLaravelは起動した画面で満足してしまったYuiさんに無理やりLTをお願いしました(ヤクザ

AWSのレンタルサーバーみたいに使えるVPS*「Amazon Lightsail」*でLaravel環境を構築した時にcomposerがメモリ不足でインストールできない問題にぶち当たった事を説明してくれました!

解決方法は一つ上のスペックに変えるという金の暴力で解決w

一応swap領域確保してインストールする方法もあるが、やっぱりあまりよろしくないらしい

ちなみに筆者も試しにLightsail使ってみたが、結構良かった!初めてでも30分くらいで環境作れました

EO4kLFJUcAQ7Svk.jpeg

資料

Amazon Lightsail に Laravel環境を作ってみた

記事に記事のURL(資料は記事の下)

最後に

当日に無断キャンセル4人いたり(一人は開始1時間後に無断キャンセルw)、唯一の共同運営者(カッポくん)がシステム障害で途中参加だったりして大変でしたが、結果有意義な時間になれたかなーと思いました。

次は3ヵ月後くらいでいいかな

みなさんお疲れ様でした!

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

大阪でLaravelの勉強会を開催しました(資料もあるよ)

大阪でLaravel勉強会しました

大阪って東京に比べると本当に勉強会とカンファレンスとか少ないんですよね。。
特にフレームワークのLaravelとかになると月に1回あるかないか(最近は増えてきた)

なので今回は自分で主催して勉強会を開催しよう!と思い立ち、この会を企画した次第です。

Twitterでもみなさん沢山投稿してくれました!
#大阪Laravel勉強会

発表者テーブル

発表者 内容
ナミザト Laravelワカンネ(゚⊿゚)から「完全に理解した()」までステップアップ
カッポ LaravelとSymfony
Daisuke Laravel5 と Laravel6 の違い -認証編-
ムカエ LaravelでSNSログインを実装
saito_takashi_1117 Laravelをデザインパターンで考察する ~ Builder Pattern ~
ぼんばー MySQLと文字コードの話
flowphantom Laravel4に触れた感想
Yui Amazon LightsailにLaravel環境作ってみた

登壇枠(15min)

Laravelワカンネ(゚⊿゚)から「完全に理解した()」までステップアップ

登壇者 ナミザト

トップバッターは今回主催で筆者のワタクシです。

Laravel始めた時って何となくで動いちゃうので、どういうフローで処理が実行されているのか
分かってない人がほとんどだと思ったので今回の題材は
Laravelのライフサイクル(アクセスしてページが表示されるまでの実行フロー)とLaravelでよく目にする機能について簡単にお話しました!

質問は一つもありませんでした!!多分クソつまらなかった

kyUawwNq (1).jpg

資料

Laravelワカンネ(゚⊿゚)から「完全に理解した()」までステップアップ


LaravelとSymfony

登壇者 カッポ

緊急システム障害対応のため登壇叶わずw

最後の懇親会の串カツ屋でLTしてくれましたw

LaravelとSymfonyのコマンドやディレクトリ構造、プロジェクトを作成する時のフローの違いについて話ししてくれました!

EO41vPOU0AAKd5o.jpeg

資料

次回の登壇で発表するそうです


Laravel5 と Laravel6 の違い -認証編-

登壇者 Daisuke

Larvel5とLaravel6のAuth認証導入手順の違いを実際にLiveコーディングしながら(しゅごい)
説明してくれました!

Laravel5ではターミナルで一発で済んだAuth認証導入

php artisan make:auth

Laravel6では少し手順が増えてます。

ライブラリをインストール

$ composer require laravel/ui

UIのタイプを選択する

vue/react/bootstrapから選択が可能

$ php artisan ui vue --auth

npmインストール&実行

先ほど選択したvue.jsをインストール

$ npm install
$ npm run dev

a5z12-srk8x-min.jpg

資料

Laravel5 と Laravel6 の違い -認証編-

LT枠

LaravelでSNSログインを実装

発表者 ムカエ

SNSログインが簡単に実装できるライブラリ「Socialite」を使ってLaravel×Twitterログインを実装するというお話でした!(半分くらいステマしてたけど

やっぱりトーク慣れしてて、聞いてて面白かったです。

TwitterAPIの申請方法はどうやってやるんですか?という質問があり、
先日たまたまその申請方法を記事にしたらしいのでそちらを参考にしてくださいとの事(サクラかな

TwitterAPI アカウント申請〜許可まで【2020年版】

alejd-zoul2-min.jpg

資料

LaravelでSNSログインを実装

その他ステマ
Laravel6.0(PHP7.3)+MySQL+Laradockで簡易的なECサイトを作る①


Laravelをデザインパターンで考察する ~ Builder Pattern ~

発表者 saito_takashi_1117

デザインパターンとは
クラス設計における定石集で、全部で23パターンあり、それぞれに特徴があります。
GoF(Gang of Four)とは『オブジェクト指向における再利用のためのデザインパターン』の著者である4人の事を指す(絶対メンバー中に中二病おる)

Laravelに用意されているBuilder Patternを簡単に利用するための抽象クラスを考察してみた!という説明をしてくれました!
インスタンス生成過程を隠蔽し、シンプルに再利用するために継承して使用することができる。らしい...

ak9ox-wpzfo-min.jpg

資料

https://qiita.com/7_asupara/items/c76af3c466b5450ef7d2


MySQLと文字コードの話

発表者 ぼんばー

Laravelはあまり触ってないが、MySQLならチョットワカルので文字コードのお話でした!
有名な寿司ビール問題を例にあげて分かりやすく説明してくれました!

寿司ビール問題とは
🍣=🍺のような絵文字は同じ文字扱い
このように文字コードが原因でMySQLにて絵文字が同じ文字列扱いを受ける問題を寿司ビール問題と言うらしい(なぜ)

ちなみにLaravelの標準のcharsetはutf8mb4で、collationはutf8mb4_unicode_ciです

思わず手がロボットのアームになってしまったぼんばーさん

axxdm-wbcm7-min.jpg

ちなみにTwitterでLaravelのDBは何を使ってるか投票を募集するとほとんどがMySQLだったそう(会場でも9.5割くらいMySQLだった)

資料もかなり分かりやすくまとめてくれてるので必見!!

資料

MySQLと文字コードの話


Laravel4に触れた感想

発表者 flowphantom

今は亡きLaravel4について語ってくれました。

Vueのくだりで会場爆笑でしたw
面白いのでぜひ資料覗いてみてください!

また追加でLaravelを完全に意識してであろうPythonのフレームワーク「Masonite」も紹介してくれました!
ディレクトリ構造とか最初の画面とかほぼ同じらしい...!

att1a-a8gdw-min.jpg

資料

Laravel4に触れた感想


Amazon LightsailにLaravel環境作ってみた

発表者 Yui

AWSエンジニアでLaravelは起動した画面で満足してしまったYuiさんに無理やりLTをお願いしました(ヤクザ

AWSのレンタルサーバーみたいに使えるVPS*「Amazon Lightsail」*でLaravel環境を構築した時にcomposerがメモリ不足でインストールできない問題にぶち当たった事を説明してくれました!

解決方法は一つ上のスペックに変えるという金の暴力で解決w

一応swap領域確保してインストールする方法もあるが、やっぱりあまりよろしくないらしい

ちなみに筆者も試しにLightsail使ってみたが、結構良かった!初めてでも30分くらいで環境作れました

EO4kLFJUcAQ7Svk.jpeg

資料

Amazon Lightsail に Laravel環境を作ってみた

記事に記事のURL(資料は記事の下)

最後に

当日に無断キャンセル4人いたり(一人は開始1時間後に無断キャンセルw)、唯一の共同運営者(カッポくん)がシステム障害で途中からの参加だったりして大変でしたが、結果有意義な時間になれたかなーと思いました。

次は3ヵ月後くらいでいいかな

みなさんお疲れ様でした!

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