20190529のlaravelに関する記事は5件です。

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バリデーション正規表現パイプ

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

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

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

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」です。

laradock公式ドキュメント

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

外部からHomestead開発環境へアクセスできるようにする

Homesteadの開発環境に外部からアクセスしたいなーって思うとき(特に別の仮想環境から)
いろいろと設定めんどくさいなーって。

でもHomesteadすごい!
コマンドポチーですぐに外部からアクセスできるようになる!

とりあえず vagrant ssh で開発環境に入ってから

share homestead.test  // Homestead.yaml内の sitesで設定したmapを指定

こうすると、ngrokが起動して
スクリーンショット 2019-05-29 20.10.22.png

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 )にアクセスする。

ばんざーい

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

Laravel(Eloquent)でLIKE検索で濁点/半濁点を区別したい→LIKE BINARYを使う

確認環境
・laravel v5.7.28
・MySQL 8.0
・PHP 7.3.0

MySQLの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です。(自己責任)

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