著者アーカイブ 杉浦

著者:杉浦

laravelのモデルであるEloquent ORMのCRUDに使うための便利な機能

Eloquent:利用の開始 5.6 Laravel
 Eloquent ORM(Object Relational Mapping)はPHPのフレームワークlaravelで実装されているSQLによるデータ操作をするモデル部分のことです。laravelでモデルを記述する際、多くの場合で以下の様に継承をします。

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    //
}

 このIlluminate\Database\Eloquent\Model;の中にあるCRUDに使える特に便利な機能を少し紹介します。少し詳しくは冒頭のリンクの説明書、とても詳しくはソースコード参照です。laravelのソースコードはとても丁寧で読みやすいためソースコードだけでも理解が進みます。
 全件取得をする時は次の様に記述できます。

$flights = Flight::all();

 これでSELECT * FROM Flights;の結果をCollection(配列の拡張形式)に変換した相当です。カラムを絞ることも簡単です。

$flights = Flight::all('primary_key', 'created_at');

 これでSELECT primary_key,created_at FROM Flights;の結果をCollection(配列の拡張形式)に変換した相当です。この様によく使われるパターンにはシンプルな回答が大体用意されています。
 ある1件を主キーを頼りに取得する時は次の様に記述できます。

$flight = Flight::find(1);

 これでSELECT * FROM Flights WHERE id = 1;の結果をモデルクラスFlightに変換した相当です。findした場合、対象が存在しないことも考えられます。そのためfindOr***の形で処理が用意されています。

$flight = Flight::findOrFail(2);
$flight = Flight::findOrNew(2);

 前者は見つからなかった場合、404エラーがユーザに返されます。後者は見つからなかった場合、新たにレコードを作成します。
 レコードを作成する時は次の様に記述できます。

$new_flight = [
    'name' => 'hoge',
    'mail' => 'fuga@example.com'
];
Flight::create($new_flight);

 create([‘カラム名’=>値の連想配列])これだけで新たにレコードがFlightsテーブルに追加されます。
 更新する時は次の様に記述できます。

$update_data = [
    'name' => 'fuga',
];
$flight = Flight::findOrFail(1);
$flight->fill($update_data)->save();

 これもcreateに似ています。fillでは渡されたカラム名のデータのみを更新します。createと違ってこちらはより複雑な操作を繰り替えすことも考えられており、save()と命令する必要があります。
 論理削除をする時はモデルにtraitを増やす必要があります。増やさない場合は物理削除です。

class Flight extends Model
{
    use SoftDeletes;
}

 実際に削除する時は次です。

$flight = Flight::findOrFail(1);
$flight->delete();

 これで作成、読み取り、更新、削除でCRUD制覇です。いずれも非常にシンプルに記述でき、大変便利です。

著者:杉浦

googleスプレッドシートのメール通知機能

 googleスプレッドシートは無料で多人数の共同作業を容易に行うことのできるExcelの様な表を扱うwebサービスです。長期に渡って多人数で共同作業を行う際、編集が行われたことを知る機能の有無は重要です。定期的に見る、ということもできますが手間であり漏れも出がちです。googleスプレッドシートにはgmailに対して通知を行う機能が備わっています。
スプレッドシートの通知をオンにする – パソコン – ドキュメント エディタ ヘルプ
 やり方は簡単。画像の様にツール > 通知ルールと開いて、通知のタイミングを設定、保存、完了するだけです。これでgoogleスプレッドシートを開いているgoogleアカウントに向かって通知メールがルールに従ってその都度送信されます。

著者:杉浦

php-cs-fixerの設定まとめページphp-cs-fixer-configuratorの紹介

 php-cs-fixer-configuratorphp-cs-fixerの設定をまとめているページです。php-cs-fixerはphpのコードを設定に従って修正してくれるアプリケーションなのですが、大本の設定マニュアルは羅列という言葉が似あうもので読むのが億劫です。php-cs-fixer-configuratorはphp-cs-fixerの設定を読みやすい形でまとめているページです。
 使い方はいたって簡単、次の画像からぱっと見でわかる様に検索して目的のルールを探すだけです。

 各ルールの詳細な説明もあります。次の画像らはblank_line_after_namespaceの説明です。これは名前空間の宣言の後には一行だけ空白行が入る、というルールです。This fixer is not configurableは設定不能というよりも設定不要と読んだ方がいいでしょう。ルールの有効無効だけが選択できます。
 


 プリセットに何が含まれているかを確認することも容易です。

著者:杉浦

__callによる未定義メソッドの呼び出し

 PHPには予約関数マジックメソッドがあり、__call()はその一つです。
PHP: マジックメソッド – Manual

__call() は、 アクセス不能メソッドをオブジェクトのコンテキストで実行したときに起動します。

 要は、未定義のメソッドを呼び出した時は代わりに__call()が呼ばれますよ、ということです。__call()は次の様に定義されます。

public mixed __call ( string $name , array $arguments )

$nameには呼ばれた際に使われたメソッド名、$argumentsには呼ばれた際に使われた引数が入ってきます。__call()を利用する事でな様々なことが出来ます。例えばエラーメッセージです。あるクラスが存在しないメソッドに向かってアクセスされようとした時、エラーメッセージを返すには次の様なコードが使えます。

public function __call($method, $parameters)
{
    sprintf('Method %s::%s does not exist.', static::class, $method);
}

 また、よく行うであろう動作をあらかじめ定義し、その動作の省略に割り当てるという使い方もあります。次の例はあるモデルにクエリビルダを繋ぎ、新規クエリビルダ呼び出しを省略する手法です。この手法を用いることで、クエリビルダと同等の働きができ、なおかつDBから引き出されたphp上における振る舞いのメソッドも多様に持つ、という風に見えるモデルを簡単に記述できます。

class Model
{
    public function __call($method, $parameters)
    {
        return $this->newQuery()->$method(...$parameters);
    }
    //省略
}

 クエリビルダへつなげる手法では更にクエリビルダの持つメソッドへチェーンしていくことが出来ます。これにより一見存在しないメソッドが存在するかのように振る舞います。この存在しないように見えるが使用されるメソッドが無秩序に増えた場合、コードを追うことが非常に大変な作業になります。これはgrepや参照呼出しを一発で当てられなくなるためです。何が呼び出されているかをいちいち確認する必要があることが面倒なのです。
 PHPDocを書くことでこの問題を解決できます。PHPDocの@methodはどの様なメソッドがあるかを示す文言で、多くのIDEはこれを追ってくれます。次の様に記述した場合、IDEはselectメソッド、whereメソッドが存在するかの様にModelクラスを扱ってくれます。

/**
 * @method QueryBuilder select(QueryBuilder $query)
 * @method QueryBuilder where(QueryBuilder $query)
 */
class Model
{
    public function __call($method, $parameters)
    {
        return $this->newQuery()->$method(...$parameters);
    }
    //省略
}
著者:杉浦

メール機能テストサービスmailtrapの紹介

Mailtrap.io — Fake smtp testing server. Dummy smtp email testing
 Mailtrapはメールにトラップを仕掛けることでメールテストを行うことのできるサービスです。送られるはずのメールをmailtrapで止めることで安全お手軽にメール機能のテストができます。
 アカウント登録が必要ですがgoogleアカウント、githubアカウントを使用することが可能なので登録は楽です。登録するとメールボックスとメールサーバが渡されます。
 
 
 メーラとサーバの情報のみならず、上の画像の赤丸の部分から各種フレームワークに対応したメール設定スニペットが用意されています。このサーバの情報に従ってメールを送ると次の様になります。

 実際には送られず、mailtrapでメールが止まり、送られたメールがどういう風になるか見ることができます。無料版は50通までしかメールを保存できませんが、あふれ次第消してもらえる仕様になっているため受信ボックス詰まって困ることはありません。mailtrapを使うことでテスト用のメールアドレスを作る必要もテストで送られてきた余分なメールを消す必要もありません。mailtrapは実に便利です。

著者:杉浦

IDEの外部連携機能

 IDE(統合開発環境)はプログラム開発を支えてくれる多機能なエディタです。web関連の開発ではネットワーク越しの環境にコードを逐一アップロードする必要がある時があります。IDEはネットワーク越しの対象と連携することもできます。
 
 自分の使っているphpstormはFTP、SFTP、FTPSで同期を行えます。このおかげでショートカットキーからアップロード、ダウンロード、自動同期などができ、いちいちファイル操作のみを目的としたアプリケーションを開く必要がなくなり、楽ができます。上の画像のアイコンにあるようにgitとの連携もそろっています。

 DBと接続する必要もあります。DBもリモートのファイルと同じ様にIDEから簡単にアクセスでき、操作のための便利な機能が揃っています。

 ローカルで表らしく任意の編集ができ、まとめてその編集を実行するクエリを送る、という仕組みです。TSVの文字とダウンロードアイコンから連想できるように任意の形式でダンプできます。もちろんinsert等のSQL命令としてもダンプできます。多機能なIDEになるほどコーディングとその周りの環境へのアクセスをIDEの操作のみで完結できます。

著者:杉浦

laravelのエラー画面

 laravelのエラー画面は単なるエラーメッセージのみならず、詳細にエラーが起こるまでの実行過程と実行環境を示してくれます。この記事ではこのエラー画面の説明をします。
 エラーを起こした画面が次です。左上のエラーメッセージと右側のエラーが起きたコードが目につきます。どういうエラーかもわからないニッチなエラーが出たときは左上の赤丸で囲ってある部分の出番です。ここをクリックするとgoogleなどでエラーメッセージをググってくれます。

 手作業でエラーの内容を調べる際には次の画像の赤丸で囲ってある部分、Application framesとAll framesを使い分けるとよいです。通常laravelプロジェクトのフォルダ構成で/vendor以下の内容を改変する事はありません。All frameは/vedor以下も含んだスタックトレース、Application framesは/vendor以下を含まないスタックトレースです。Application framesで異常な値になった部分を大雑把に見つけ出し、All frameでより詳細に絞りこむ方法はよくとります。

 値を見つけ、追っていくと先に述べました。エラー画面で値の中身を追うには下の画像の赤丸部です。次の関数に値を渡すコードの行部分と引数の中身を見ることが出来ます。

 GET、POSTなどの通信に用いた値も右下部に格納されています。あまり見せるべき情報でないので隠してありますが、更に下の方にはサーバの情報も記述されてあります。

著者:杉浦

万能クラスや数珠つなぎの継承を作らずにコードの共有を行うトレイト

PHP: トレイト – Manual

トレイトは、PHP のような単一継承言語でコードを再利用するための仕組みのひとつです。 トレイトは、単一継承の制約を減らすために作られたもので、 いくつかのメソッド群を異なるクラス階層にある独立したクラスで再利用できるようにします。 トレイトとクラスを組み合わせた構文は複雑さを軽減させてくれ、 多重継承や Mixin に関連するありがちな問題を回避することもできます。

 トレイトはtraitと書き、次の様にclassと同じ書き方をし、useで読み込みます。関数などの名前が衝突した際にはinsteadofでどちらを使うか決定する、asで別名として扱う対応を行います。

<?php
trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
    public function moreBigTalk() {
        echo 'X';
    }
}

trait B {
    public function smallTalk() {
        echo 'b';
    }
    public function bigTalk() {
        echo 'B';
    }
}

class Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
    }
}

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
    $this->moreBigTalk();
}

 いまのところ使ったことはないですが可視性の変更も可能です。
 トレイトの特に強力で扱いやすい部分が名前の扱いです。トレイトなしでコードを再利用する場合、共通のクラスを継承する、ユーティリティクラスを作る、別ファイルにしてincludeかrequireしてグローバル領域に配置するといった手法が考えられます。それらの手法の複雑さの原因になりうるという危うい点を、継承を行わず、グローバルを汚染せず、区分をtraitの名前につけてコードの再利用を可能にすることでトレイトは回避しています。
 IDEは画像の様に内部に何が入っているのかアイコンで表示してくれるのでその点でもありがたいです。

著者:杉浦

DRYの原則と抽象化

 DRYの原則はコーディングの原則の一つでDon’t Repeat Your Selfの略語です。これは同じことを繰り返し書かないでください、という意味で、Andrew Hunt, David Thomasが達人プログラマの中で提唱した原則です。ある一つのことを何度もコーディングした場合、そのことの変化に合わせて繰り返した分に合わせて何度もコーディングを変更する必要があります。これは無駄です。そして変更の漏れはバグになります。この無駄とバグをあらかじめ防ぐために同じことを繰り返し書くべきでない、という原則が提唱されました。
 同じことを繰り返し書くな、という言葉の”同じこと”という部分は重要です。単に同じ記述をしていることを理由に全てをfor、関数、クラスなどにまとめるべきではありません。ある同じ記述がそれぞれ違うことを表現している記述であった場合、片方だけ変化する事態は少なくないのです。同じことであるかそうでないのかを判断する時の基準として抽象化を用いられます。コーディングしたいもの(ソースコードそのものでなく)を抽象化した時、共通点が現れたならばその共通点はまさしく同じことであり、繰り返さずまとめて記述するべき部分です。

著者:杉浦

flexbox学習用のフリーゲームの紹介

 CSSのflexboxは便利ですがプロパティはあまりに多彩であり、覚えきるのは手間です。また、flexboxの理解が程ほどでも力業で望んだデザインに近いものを作ることは可能です。flexboxの内容は覚えずに適宜調べることが解決法のひとつですが、その場合flexboxでは何ができるかを知っておくことが重要です。ここで紹介するflexbox学習ゲームはflexboxの各プロパティを用いて工夫することを強いてくれます。学習ゲームを通すことでflexboxのできることを一通り知ることができます。
 Flexbox Froggy – CSS flexbox学習ゲーム
 Flexbox Defense
 Flexbox Froggyはflexboxに従って動く蛙を同じ色の蓮の葉に配置するゲーム、Flexbox Defenseはflexboxに従って配置されるタワーを用いたタワーディフェンスゲームです。どちらも高難易度になってくるとプロパティの豊富な組み合わせが必要になりなかなか一筋縄ではいきません。