- 投稿日:2020-01-23T19:58:26+09:00
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のファイルに不備があるのか?
右側の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"の後ろのカンマ...いりません!!!
これを消したらエラーも消えました。
おわりに
認証機能を追加するべく、Laravel6のuiパッケージを入れ込んでからこのエラーがで始めたので、色々と考え込んでしまったけれど、結局は小さなミスでした。
直前までUIも問題なく動いていたのも時間を食ってしまいました。
しかしながら探しても日本語の記事が全然ない...
同じようなことが起こった方と自分への忘備録として残しておきます。参考リンク
- 投稿日:2020-01-23T16:56:31+09:00
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
COLLATEutf8mb4_unicode_ci
対処法
doctrine/dbal
の最新である2.10
で追加されたバグが原因らしい
v.2.9.3
にすると治りましたcomposer require doctrine/dbal:2.9.3 php artisan migrate参考
- 投稿日:2020-01-23T16:56:31+09:00
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
COLLATEutf8mb4_unicode_ci
対処法
doctrine/dbal
の最新である2.10
で追加されたバグが原因らしい
v.2.9.3
にすると治りましたcomposer require doctrine/dbal:2.9.3 php artisan migrate参考
- 投稿日:2020-01-23T16:50:37+09:00
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.phppublic 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.phppublic 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
ちなみにテストはしてないので悪しからず
終わり
- 投稿日:2020-01-23T16:50:37+09:00
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.phppublic 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.phppublic 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
ちなみにテストはしてないので悪しからず
終わり
- 投稿日:2020-01-23T15:39:51+09:00
ローカル開発環境では画像が表示されるのに,VPSのリモートサーバーでは画像が表示されない
chromeDevoolのコンソール
エラーメッセージGET ~image_name~.jpeg 403 (Forbidden)
- このリンクから情報収集
私はあなたが経験しているこの403の問題が共有ホスティングに置かれていると推測しています。
シンボリックリンクを作成する
php artisan storage:link、
にはstorage/app/public`フォルダーへの完全な絶対パスが含まれます。これがおそらくサーバーによる403応答の原因です。解決策は、プロジェクトルートからの相対パスでシンボリックリンクを作成することです
解決
`php artisan storage:link でつくったシンボリックリンクを削除
ln -s ../storage/app/public public/storage上記で貼り直し
実行する階層に注意理由
- 上に書いてある通りの原因だった
- 一番上のリンクに一通り原因が書かれてるっぽい
- autloaderがよみに行かないくらい上から書かれてたから403エラーだったってことでいいのかな
- 投稿日:2020-01-23T15:01:24+09:00
Laravelでブログの本文の続きを「...」にする方法
{!! nl2br(e(str_limit(変数, 制限文字数))) !!}
で制限文字数から先の文章は「...」になります。
解説
nl2br
PHPの改行コードになります。(htmlで言う
<br>
)
https://www.php.net/manual/ja/function.nl2br.phpe()
()内をエスケープさせます。
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として出力させようとしています。個人的に
なにこれ解説むっず。本当に合ってんのかこれ。
でも使ってみると結構便利なので使ってみてください。何かあればコメントお願いします><
- 投稿日:2020-01-23T14:46:13+09:00
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
- 投稿日:2020-01-23T14:15:12+09:00
Laravelをデザインパターンで考察する ~ Builder Pattern ~
デザインパターン
デザインパターンは、いろんな文脈で使われるが、ここでのデザインパターンはGoFのデザインパターン。
その中で今回は、Builder Patternでの実装箇所を取り上げる。
Builder Patternは、デザインパターンの分類、生成・構成・振る舞いのうちの生成に分類される。
生成過程を抽象化したり、コンストラクタの引数が多いとか複雑なときに使うデザインパターン。基本的な説明は以下のリンクに任せる
[デザインパターン]
https://www.techscore.com/tech/DesignPattern/index.html/[Builderパターン | PHPデザインパターン]
https://www.ritolab.com/entry/125Illuminate\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\SessionServiceProviderprotected function registerSessionManager() { $this->app->singleton('session', function ($app) { return new SessionManager($app); }); }SessionServiceProviderでSessionManagerがコンテナに登録されている
SessionManagerは、あくまで生成過程を抽象化してくれているもので、最終的にはIlluminate\Session\Storeのインスタンスが帰ってくる。SessionManager
Illuminate\Session\SessionManagerprotected 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\Managerprotected 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インスタンスが取得できるようになる。
.envSESSION_DRIVER=databaseArtisanコマンド実行php artisan session:table php artisan migrateSession処理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
- 投稿日:2020-01-23T12:46:14+09:00
大阪で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でよく目にする機能について簡単にお話しました!質問は一つもありませんでした!!
多分クソつまらなかった資料
Laravelワカンネ(゚⊿゚)から「完全に理解した()」までステップアップ
LaravelとSymfony
登壇者 カッポ
緊急システム障害対応のため登壇叶わずw
最後の懇親会の串カツ屋でLTしてくれましたw
LaravelとSymfonyのコマンドやディレクトリ構造、プロジェクトを作成する時のフローの違いについて話ししてくれました!
資料
次回の登壇で発表するそうです
Laravel5 と Laravel6 の違い -認証編-
登壇者 Daisuke
Larvel5とLaravel6のAuth認証導入手順の違いを実際にLiveコーディングしながら(しゅごい)
説明してくれました!Laravel5ではターミナルで一発で済んだAuth認証導入
php artisan make:auth
Laravel6では少し手順が増えてます。
ライブラリをインストール
$ composer require laravel/uiUIのタイプを選択する
vue/react/bootstrapから選択が可能
$ php artisan ui vue --authnpmインストール&実行
先ほど選択したvue.jsをインストール
$ npm install $ npm run dev資料
LT枠
LaravelでSNSログインを実装
発表者 ムカエ
SNSログインが簡単に実装できるライブラリ「Socialite」を使ってLaravel×Twitterログインを実装するというお話でした!(
半分くらいステマしてたけど)やっぱりトーク慣れしてて、聞いてて面白かったです。
TwitterAPIの申請方法はどうやってやるんですか?という質問があり、
先日たまたまその申請方法を記事にしたらしいのでそちらを参考にしてくださいとの事(サクラかな)TwitterAPI アカウント申請〜許可まで【2020年版】
資料
その他ステマ
Laravel6.0(PHP7.3)+MySQL+Laradockで簡易的なECサイトを作る①
Laravelをデザインパターンで考察する ~ Builder Pattern ~
発表者 saito_takashi_1117
デザインパターンとは
クラス設計における定石集で、全部で23パターンあり、それぞれに特徴があります。
GoF(Gang of Four)とは『オブジェクト指向における再利用のためのデザインパターン』の著者である4人の事を指す(絶対メンバー中に中二病おる)Laravelに用意されているBuilder Patternを簡単に利用するための抽象クラスを考察してみた!という説明をしてくれました!
インスタンス生成過程を隠蔽し、シンプルに再利用するために継承して使用することができる。らしい...資料
https://qiita.com/7_asupara/items/c76af3c466b5450ef7d2
MySQLと文字コードの話
発表者 ぼんばー
Laravelはあまり触ってないが、MySQLならチョットワカルので文字コードのお話でした!
有名な寿司ビール問題を例にあげて分かりやすく説明してくれました!寿司ビール問題とは
?=?のような絵文字は同じ文字扱い
このように文字コードが原因でMySQLにて絵文字が同じ文字列扱いを受ける問題を寿司ビール問題と言うらしい(なぜ)ちなみにLaravelの標準のcharsetは
utf8mb4
で、collationはutf8mb4_unicode_ci
です思わず手がロボットのアームになってしまったぼんばーさん
ちなみにTwitterでLaravelのDBは何を使ってるか投票を募集するとほとんどがMySQLだったそう(会場でも9.5割くらいMySQLだった)
資料もかなり分かりやすくまとめてくれてるので必見!!
資料
Laravel4に触れた感想
発表者 flowphantom
今は亡きLaravel4について語ってくれました。Vueのくだりで会場爆笑でしたw
面白いのでぜひ資料覗いてみてください!また追加でLaravelを完全に意識してであろうPythonのフレームワーク「Masonite」も紹介してくれました!
ディレクトリ構造とか最初の画面とかほぼ同じらしい...!資料
Amazon LightsailにLaravel環境作ってみた
発表者 Yui
AWSエンジニアでLaravelは起動した画面で満足してしまったYuiさんに無理やりLTをお願いしました(
ヤクザ)AWSのレンタルサーバーみたいに使えるVPS*「Amazon Lightsail」*でLaravel環境を構築した時にcomposerがメモリ不足でインストールできない問題にぶち当たった事を説明してくれました!
解決方法は一つ上のスペックに変えるという金の暴力で解決w
一応swap領域確保してインストールする方法もあるが、やっぱりあまりよろしくないらしい
ちなみに筆者も試しにLightsail使ってみたが、結構良かった!初めてでも30分くらいで環境作れました
資料
Amazon Lightsail に Laravel環境を作ってみた
記事に記事のURL(資料は記事の下)
最後に
当日に無断キャンセル4人いたり(一人は開始1時間後に無断キャンセルw)、唯一の共同運営者(カッポくん)がシステム障害で途中参加だったりして大変でしたが、結果有意義な時間になれたかなーと思いました。
次は3ヵ月後くらいでいいかなみなさんお疲れ様でした!
- 投稿日:2020-01-23T12:46:14+09:00
大阪で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でよく目にする機能について簡単にお話しました!質問は一つもありませんでした!!
多分クソつまらなかった資料
Laravelワカンネ(゚⊿゚)から「完全に理解した()」までステップアップ
LaravelとSymfony
登壇者 カッポ
緊急システム障害対応のため登壇叶わずw
最後の懇親会の串カツ屋でLTしてくれましたw
LaravelとSymfonyのコマンドやディレクトリ構造、プロジェクトを作成する時のフローの違いについて話ししてくれました!
資料
次回の登壇で発表するそうです
Laravel5 と Laravel6 の違い -認証編-
登壇者 Daisuke
Larvel5とLaravel6のAuth認証導入手順の違いを実際にLiveコーディングしながら(しゅごい)
説明してくれました!Laravel5ではターミナルで一発で済んだAuth認証導入
php artisan make:auth
Laravel6では少し手順が増えてます。
ライブラリをインストール
$ composer require laravel/uiUIのタイプを選択する
vue/react/bootstrapから選択が可能
$ php artisan ui vue --authnpmインストール&実行
先ほど選択したvue.jsをインストール
$ npm install $ npm run dev資料
LT枠
LaravelでSNSログインを実装
発表者 ムカエ
SNSログインが簡単に実装できるライブラリ「Socialite」を使ってLaravel×Twitterログインを実装するというお話でした!(
半分くらいステマしてたけど)やっぱりトーク慣れしてて、聞いてて面白かったです。
TwitterAPIの申請方法はどうやってやるんですか?という質問があり、
先日たまたまその申請方法を記事にしたらしいのでそちらを参考にしてくださいとの事(サクラかな)TwitterAPI アカウント申請〜許可まで【2020年版】
資料
その他ステマ
Laravel6.0(PHP7.3)+MySQL+Laradockで簡易的なECサイトを作る①
Laravelをデザインパターンで考察する ~ Builder Pattern ~
発表者 saito_takashi_1117
デザインパターンとは
クラス設計における定石集で、全部で23パターンあり、それぞれに特徴があります。
GoF(Gang of Four)とは『オブジェクト指向における再利用のためのデザインパターン』の著者である4人の事を指す(絶対メンバー中に中二病おる)Laravelに用意されているBuilder Patternを簡単に利用するための抽象クラスを考察してみた!という説明をしてくれました!
インスタンス生成過程を隠蔽し、シンプルに再利用するために継承して使用することができる。らしい...資料
https://qiita.com/7_asupara/items/c76af3c466b5450ef7d2
MySQLと文字コードの話
発表者 ぼんばー
Laravelはあまり触ってないが、MySQLならチョットワカルので文字コードのお話でした!
有名な寿司ビール問題を例にあげて分かりやすく説明してくれました!寿司ビール問題とは
?=?のような絵文字は同じ文字扱い
このように文字コードが原因でMySQLにて絵文字が同じ文字列扱いを受ける問題を寿司ビール問題と言うらしい(なぜ)ちなみにLaravelの標準のcharsetは
utf8mb4
で、collationはutf8mb4_unicode_ci
です思わず手がロボットのアームになってしまったぼんばーさん
ちなみにTwitterでLaravelのDBは何を使ってるか投票を募集するとほとんどがMySQLだったそう(会場でも9.5割くらいMySQLだった)
資料もかなり分かりやすくまとめてくれてるので必見!!
資料
Laravel4に触れた感想
発表者 flowphantom
今は亡きLaravel4について語ってくれました。Vueのくだりで会場爆笑でしたw
面白いのでぜひ資料覗いてみてください!また追加でLaravelを完全に意識してであろうPythonのフレームワーク「Masonite」も紹介してくれました!
ディレクトリ構造とか最初の画面とかほぼ同じらしい...!資料
Amazon LightsailにLaravel環境作ってみた
発表者 Yui
AWSエンジニアでLaravelは起動した画面で満足してしまったYuiさんに無理やりLTをお願いしました(
ヤクザ)AWSのレンタルサーバーみたいに使えるVPS*「Amazon Lightsail」*でLaravel環境を構築した時にcomposerがメモリ不足でインストールできない問題にぶち当たった事を説明してくれました!
解決方法は一つ上のスペックに変えるという金の暴力で解決w
一応swap領域確保してインストールする方法もあるが、やっぱりあまりよろしくないらしい
ちなみに筆者も試しにLightsail使ってみたが、結構良かった!初めてでも30分くらいで環境作れました
資料
Amazon Lightsail に Laravel環境を作ってみた
記事に記事のURL(資料は記事の下)
最後に
当日に無断キャンセル4人いたり(一人は開始1時間後に無断キャンセルw)、唯一の共同運営者(カッポくん)がシステム障害で途中からの参加だったりして大変でしたが、結果有意義な時間になれたかなーと思いました。
次は3ヵ月後くらいでいいかなみなさんお疲れ様でした!