- 投稿日:2019-05-29T22:59:40+09:00
laravel-バリデーション正規表現(パイプ「|」利用)(頭が0つきの数字)
バリデーション時に、正規表現のパイプを利用し、00、01、02、0、1、2の値のみを通すようなバリデーションを作成しようと思います。
php$this->validate($request, [ 'number' =>['required', 'regex:/^([0-2]|0[0-2])$/']; ]);パイプを使う際は、'required|regex:/^([0-2]|0[0-2])+$/'と一行で、バリデーションルールを書いてしまうと、Laravel上だと、バリデーションごとにパイプを挟んでいるため、正規表現の中のパイプが他のバリデーションルールに切り替わったのかなとLaravelは判断するため、エラーになってしまいます。そのため、配列で一つずつ指定してあげる必要があります。
/^([0-2]|0[0-2])$/は「^」が行頭、「\$」が行末、パイプがor、[]は○○から○○まで、つまり0~2までもしくは、00~02となります。
前書いた正規表現記事
参考にさせていただいた記事-laravelバリデーション正規表現パイプ
- 投稿日:2019-05-29T22:51:42+09:00
LaravelでSimpleXMLElementクラスを使う際の注意
問題
通常のPHPファイルでは下記の通りSimpleXMLElementクラスを生成できるが、Laravelアプリ内のPHPファイルではクラスが見つからないエラーとなる。
$results = new SimpleXMLElement($result);解決策
SimpleXMLElementクラスの前に\(バックスラッシュ)追加で解決。
$results = new \SimpleXMLElement($result);参考URL:https://stackoverflow.com/questions/46610501/class-simplexmlelement-not-found
- 投稿日:2019-05-29T22:17:12+09:00
LaradockでLaravel Duskを導入する
Laradockでブラウザテスト用のパッケージである「Laravel Dusk」を利用するためには、いくつか設定しなければならないことがあります。
Laravel DuskはChrome Driverを使っており、適切に設定しないとうまく動作しません。
ドメインが「localhost」だと動作しないので「○○○○.test」とする必要があります。
ホストOSにWindows、DockerはDocker for Windowsを使用しています。Seleniumコンテナを立ち上げます。Laravel Duskはすでにインストール済みであると想定します。
環境
ホストOS:Windows 10 Pro
Laravel 5.5
Docker 18.09 Laradock 7.14 Ubuntu 16.04 PHP 7.2 nginx 1.15設定手順
1. DNSの設定 Windowsのhostsファイル編集
Windowsのhostsファイルを編集します。hostsファイルは、IPアドレスとドメイン名の一覧を記述したファイルで、DNSより先に参照されます。ファイルの場所:C:\Windows\System32\drivers\etc\hosts
ファイルの末尾に以下を追記してください。
127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost 127.0.0.1 laravel.test // Laravelの任意のアプリケーション名*「laravel.test」は後に作成する.env.dusk.localの「APP_NAME=laravel.test」に該当します。任意の名称を付けることができますが「○○○○.test」とする必要があります。
2. laradockの設定 docker-compose.ymlファイル
docker-compose.ymlファイルの「selenium」の箇所に以下を追記してください。700行目当たりです。selenium: ... depends_on: - nginx links: - nginx: laravel.test // 任意のアプリケーション名3. Laravelの設定 .env.dusk.localファイル
Laravelの.envファイルをコピーして.env.dusk.localファイルを作成し、アプリ直下に配置してください。
LaravelはDuskを実行する際にこのファイルを見にいきますので、ここで設定した内容がDusk実行時に利用されます。APP_NAME=laravel.test // 任意のアプリケーション名 USE_SELENIUM=true // 末尾に追記*注意点:Duskを実行すると「.env.dusk.local」ファイルを利用するはずですが、なぜか勝手に「.env」を使用することもあります。「php artisan config:clear」や「php artisan config:cache」を使って挙動を確認しましたが、安定しないことがあるので「.env」だけ使用する方がよいかもしれません。
その場合は上記の内容を「.env」に追加してください。
SQLiteの利用
データベースにSQLiteを利用する場合は以下を変更します。
SQLiteは軽量なためテストの実行速度が上がります。大量のテストを行う場合には時間の短縮になります。
デフォルトでは「database.sqlite」というSQLiteのファイルを使用するよう設定されています。DB_CONNECTION=sqlite // sqliteに変更 以下の設定はコメントアウトする(先頭に#を付けるとコメントアウトできます) # DB_HOST=mysql # DB_PORT=3306 # DB_DATABASE=laravel # DB_USERNAME=secret # DB_PASSWORD=secret*注意点:SQLiteはうまく動作しないことがあるので注意してください。また、本番環境でMySQLを使う場合は、テストもMySQLで行った方がよいという観点もあります。
4. DuskTestCaseの修正
tests/DuskTestCaseのdriverメソッドを以下のように修正してください。protected function driver() { if (env('USE_SELENIUM', 'false') == 'true') { return RemoteWebDriver::create( 'http://selenium:4444/wd/hub', DesiredCapabilities::chrome() ); } else { return RemoteWebDriver::create( 'http://localhost:9515', DesiredCapabilities::chrome() ); } }5. seleniumイメージの作成 docker-compose build selenium
seleniumイメージを作成します。6. コンテナの立ち上げ docker-compose up -d nginx mysql selenium
nginx, mysql, seleniumコンテナを立ち上げます。7. コンテナに入りDuskを実行
後は通常通りコンテナに入り、Duskを実行します。
Duskを実行する前に必ずキャッシュをクリアしてください。docker-compose exec --user=laradock workspace bash /var/www$ php artisan config:clear /var/www$ php artisan dusk以上が設定の手順になります。
この記事はlaradockの公式ドキュメントを参考にしました。
該当箇所は「Running Laravel Dusk Tests」の「Option 2: With Selenium」です。
- 投稿日:2019-05-29T20:15:24+09:00
外部からHomestead開発環境へアクセスできるようにする
Homesteadの開発環境に外部からアクセスしたいなーって思うとき(特に別の仮想環境から)
いろいろと設定めんどくさいなーって。でもHomesteadすごい!
コマンドポチーですぐに外部からアクセスできるようになる!とりあえず vagrant ssh で開発環境に入ってから
share homestead.test // Homestead.yaml内の sitesで設定したmapを指定ngrok by @inconshreveable (Ctrl+C to quit) Session Status online Session Expires 7 hours, 57 minutes Update update available (version 2.3.29, Ctrl-U to update) Version 2.2.8 Region United States (us) Web Interface http://192.168.10.57:4040 Forwarding http://6ff770f8.ngrok.io -> localhost:80 Forwarding https://6ff770f8.ngrok.io -> localhost:80 Connections ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00こんなのがでてくる。
そしたら Forwarding されているURL(この場合は http://6ff770f8.ngrok.io )にアクセスする。
ばんざーい
- 投稿日:2019-05-29T12:24:43+09:00
Laravel(Eloquent)でLIKE検索で濁点/半濁点を区別したい→LIKE BINARYを使う
確認環境
・laravel v5.7.28
・MySQL 8.0
・PHP 7.3.0MySQLのLIKEでは濁点/半濁点の区別を行いません。大文字と小文字の区別もしません。
厳密に一致させるときは、LIKE BINARY
をつかいます。ふつうのSQLではこう。
SELECT * FROM user WHERE name LIKE BINARY '%やまだ%;Eloquentではこうやります。
$user->where('name','LIKE BINARY','%やまだ%');以前はサポートされていなかったようですが
どこかのタイミングで修正されました。
https://github.com/laravel/framework/commit/76f6da4dab1e9e4847362a2b2b0c428e25805f0c#diff-cc3d43e01028390141596ae0da939930サポートされていないバージョンを使用していて、アップデートはできないよという場合は
上記コミットと同じようにコードを修正すればOKです。(自己責任)