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

どうもこんにちは。

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

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

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

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

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

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

[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

Raspbian(RaspberryPi)でnginx+php-fpmを動かしてみる。

完全に自分用ですが。

nginxとphp-fpmを動かしてみたかったので、部屋に転がってたRaspberryPiにインストールしてみました。

とりあえず必要なパッケージをインストール。

依存パッケージはaptitudeの方で全部拾ってきてくれるはず。

ちなみにバージョンはnginxが1.2.1 php5-fpmは5.4.4です。

 

次にnginxの設定。デフォルトの設定ファイルの中から特に書き換えた部分だけ抜き出してます。

 

nginx, php-fpmの起動。

最後に起動設定の変更。

 

これでサイトルートの中にphpinfo();でも書いたphpファイルを投げ込んでアクセスできるかどうか試したらいいと思います。

 

一番ハマったポイントはfastcgi_passの値です。いろいろなブログの記事を読んでみても、設定値は「127.0.0.1:9000」にしろ~って書いてあるのですが、残念ながら俺のオツムではよく分からず……。でもnginxのデフォルト設定ファイルにはもう一つ、sockファイルを入力する方法も併記されておりまして、そちらのパスを通してみたらうまく動きました。とりあえず動いたのでこれでよしということで(´・ω・`)

The mysql driver is not currently installed と言われて怒られた話。

今日、Zend Frameworkで組まれたWebアプリを動かしたらこんなエラーが出た。

Fatal error: Uncaught exception ‘Zend_Db_Adapter_Exception’ with message ‘The mysql driver is not currently installed’

mysqlドライバーがインストールされてないから使えませんよ>< ってことかなぁ。phpinfo()で状況を見たら、確かにmysqlモジュールは読み込まれてなかった。

昨日までは動いていたんですけどね(´;ω;`)  とりあえずphp.iniにextensionでmysql.spやらpdo_mysql.soあたりの記述がされてないなかなーと思って見てみたけどそれもしっかり書かれていた。

PHPだけじゃないかもしれないと思い、Apacheのエラーログをみてみると、なんだか怪しい記述を発見。

PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php/modules/mysql.so’ – libmysqlclient.so.15: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php/modules/mysqli.so’ – libmysqlclient.so.15: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php/modules/pdo_mysql.so’ – libmysqlclient.so.15: cannot open shared object file: No such file or directory in Unknown on line 0

おお……問題の箇所どんぴしゃりなエラーですな。共有オブジェクト「libmysqlclient.so.15」が開けませんよ~ということですかね。
試しにfindコマンドでこのファイルを探してみたら、/usr/lib/mysql に入っていました。コイツ自体はシンボリックリンクの模様。実体は「libmysqlclient.so.15.0.0」っていう名前でした。

ファイルはあるのに読み込めないということは、リンクを繋ぎ直してやればいい、ということで、ldconfigコマンドで共有オブジェクトのリンクを更新してみました。

# ldconfig -v | grep libmysql

しかしお目当ての文字列は出てこず。

設定ファイルであるld.so.confの中身を見ると、以下の記述がありました。

include ld.so.conf.d/*.conf]

操作していた当時は特におかしいと思わなかったのですが、「]」って本来いらない文字列ですよね。
この時はどうしても読み込まないので、デフォルトの共有ディレクトリ直下(/usr/lib)に「libmysqlclient.so.15」をコピーしました。

# cp /usr/lib/mysql/libmysqlclient.so.15 /usr/lib

これでまたldconfig -v | grep libmysql をやってみたら、やっと出て来ました;;

Webサーバーを再起動して一応一件落着。

解決した後、ld.so.confの怪しい記述を修正してみました。

include ld.so.conf.d/*.conf

この状態でもう一度ldconfigを実行したら、しっかり出てくるようになりました!

# /sbin/ldconfig -v |grep libmysql
libmysqlclient_r.so.15 -> libmysqlclient_r.so.15.0.0
libmysqlclient.so.15 -> libmysqlclient.so.15.0.0
libmysqlclient_r.so.15 -> libmysqlclient_r.so.15
libmysqlclient.so.15 -> libmysqlclient.so.15

ダブってしまっているので暫定的に作ったリンクは削除して、重複を解消して今度こそフィニッシュ。

間違いの元は記述ミスだったんですね……まじつらいわ(´;ω;`)