[PHP/Laravel] Eloquentモデルで初期値(デフォルト値)を設定したいときは$attributesを触ってなんとかする。

どうもこんにちは。

今回言いたいことは、すでにタイトルで9割ぐらい説明し終わってしまっているのですが、一応そこに思い至った経緯と詳細を書き連ねておこうと思います。

データモデルのデフォルト値を予め決めておきたい場合、Migrationのロジックの中でdefault()を使えば設定できますが、これはデータソースに対する操作なので、あまり適切ではないと考えました。(データソースが変わればそんなメソッドは簡単に使えなくなってしまうため。)

デフォルト値は業務ルールに関わる事が多いので、なるべくドメインモデルに当たる箇所に入れるべきだと思いました。
そこで、デフォルト値を入れたいEloquentモデルのコード内に、以下のように記述しました。

これで、新規にモデルを生成したときに、対象プロパティにデフォルト値が挿入されます。

この辺の説明、Laravelのリファレンスには無かったとです(´;ω;`)

以下の記事を参考にしました。
How to set a default attribute value for a Laravel / Eloquent model?

[PHP] WindowsでCodeceptionを使うと、ChromeDriverが動かない!?

なんとか動くようになったけど、久々にめっちゃハマった(´;ω;`)

 

最近のChromeって、コード経由でコントロールするときにSeleniumを挟まずにChromeDriver単体で触ることができるんですね。知らずに生きてましたわ;;

というわけで、CodeceptionでChromeDriver経由でChromeを触ってみました。

(ちなみに、使用しているOSはWindow 10 Home 64bitで、Git Bash(64bit)をインストールして、これをシェルとして使っています。)

この辺のChromeDriverを使うまでの手順は公式ページのWebDriverのページに書いてあるものをそのまま実行しています。

To run tests in Chrome browser you may connect to ChromeDriver directly, without using Selenium Server.

1. Install ChromeDriver.
2. Launch ChromeDriver: chromedriver --url-base=/wd/hub
3. Configure this module to use ChromeDriver port:

引用元: WebDriver – Codeception – Documentation (http://codeception.com/docs/modules/WebDriver#ChromeDriver)

 

この通りにやってみて、シェルで「./vendor/bin/codecept run」と走らせてみたのですが、エラーが発生します。

「レスポンスがJSONデコードできないよ!」って言うエラーですけど、問題はそこではなくて、ChromeDriverからのレスポンスが「unhandled request」ってなってるところ。
一応Chromedriverをブラウザ経由で(http://localhost:9515)見てみましたが、同じレスポンスが帰ってきます。これじゃあさっぱり前に進みませんねぇ。

なぜなのかわからず、ChromeDriver周りのエラーをググっていったら、こんな記事を発見。

Issue with using selenium and webdriver doc · Issue #2968 · electron/electron · GitHub
https://github.com/electron/electron/issues/2968

Windowsでは動かないと、似たような問題を訴えてらっしゃいます。
そしてこの人がやってみたことは、–url-baseのパスを「wd/hub」にすること。

改めてコマンドを叩いたら、バッチリ動きました。

おうふ、マジかよ……(‘A`)

多分Linuxでは問題なく動くんだろうなぁ。
Windowsなんぞで動かすやつなんぞしらん!ってことなのでしょか?つらみ(´;ω;`)

[Codeception] amOnPageメソッドの挙動の食い違いに泣かされる

振る舞いテスト(Acceptance Testing)の動作検証中にめっちゃくちゃハマってしまったのでメモっておきますorz

 

複数サイトにまたがってアクセスするので、受け入れテストスイートの設定ファイル(acceptance.suite.yml)内のurl欄を空欄にしたうえで、以下のようなテストコードを書きました。

このコードを、PhpBrowser上で動かすと普通に動くのですが、Firefox上で動かすとエラーが出てしまいます。

一見どういう意味なのか分からないのですが、「codecept run –debug」コマンドで動作の内容を見ながら確認すると、GET周りで変な挙動が……

なぜかURLの頭に「/」がついてる!

まぁamOnPage()は相対URL用のメソッドだから、スラッシュが頭についちゃうんでしょうかね。
amOnUrl()を使ってみたら問題なく動きました。

でもPhpBrowserでは普通に動いてしまうのは紛らわしい……(´・ω・`)

[laravel] 既存のユーザー情報を「認証済み」にしてテストケースを進めたい

Webアプリケーションを作ってると、目的の画面へ行ってアサートを走らせる前に、必ずユーザー認証を済ませて置かねばならないケースが多々あります。というかそんなパターンが大多数なんじゃないかと思わなくもない……

Laravelさんはそのへんもぬかりなく、actingAs()メソッドで簡単に実現してくれます。

以下リファレンスから引用。

でも、リファレンスの例文通りに動かすと、認証用にユーザーを作り、DBに書き込んでから動かしているみたいで、なんというかめんどくさいです(´・ω・`)

俺の場合はSeederで予めユーザーデータを定義してあるので、できればそっちを使ってテストしたいんですよね……。
そういう時は↓のように書くといけるみたいです。

Eloquentのfindメソッドで取ってくるだけ。actingAsメソッドの引数は、Authenticatableインターフェースが実装されていればなんでもいいので、こんな書き方でいけるみたいです。

ちょーかんたん。

[PHP] ZipArchive::setPassword は解凍専用

だってよ! ついさっき知ったよ!(;ω;)

メソッド名だけ見て、圧縮に使うもんなんだな~と早合点してずっと試行錯誤してましたつらいorz
リファレンスはしっかり読みましょうというお話です。

PHPの公式リファレンスのNoteには以下のように書いてあります。 → http://php.net/manual/ja/ziparchive.setpassword.php

注意:

This function only sets the password to be used to decompress the archive; it does not turn a non-password-protected ZipArchive into a password-protected ZipArchive.

「展開するときにだけ使えるよ!パスワード保護されていないZipを保護する用途には使えないよ!」みたいなことがちゃんと書かれてますね……。

英語の記事でもすぱっと一発で読めるようになりたい。なりたい・・・(´・ω・`)

ちなみにどうしてもPHP上でパスワードを掛けて圧縮したかったら、現状はexec関数でシステムコールを利用するぐらいしか無いんじゃないでしょうか。
参考→http://blogs.yahoo.co.jp/terere4040/31295794.html