ECサイト運営開発記

PHPフレームワーク Laravelの使い方を中心とした通販サイトの開発日記

LaravelのELOQUENTの便利なSETTERとGETTER

LaravelのORMには特定のフィールドに対して、ちょっとした処理を加えて、データを保存できたりする便利な
メソッドがあります。わかりやすいのは、パスワードを暗号化して保存したい場合。
$user->password="password" としてやるだけで、文字列が暗号化されてデータがセットされるみたいな。

方法は非上に簡単で、set_{フィールド名}でメソッドを作ってあげればいいだけ。あとは、そのメソッド内で暗号化なりなんなり好きにすればいいだけです。下のサンプルでは、LaravelのCrypterを使って暗号化するサンプルです。

<?php 

// models/user.php
use Laravel\Crypter;
use Laravel\Database\Eloquent\Model;

class User extends Eloquent {

	public static $table = "user";
	public static $key = "user_id";
	public static $timestamps = false;

	public function set_password($password){
	  $this->set_attribute("password", Crypter::encrypt($password));
	}
}

// コントローラー
// controllers/user.php
class User_Controller extends Base_Controller {
	public function action_add(){
	  $user=new User;
	  $user->name="nohohonx";
	  $user->password="hogehoge";
	  $user->save();
	}
}
?>

phpMyAdminなどで、userテーブルを見ると、暗号化されたU326DItRyQYN8Pb3Eu82iNshUMqwngf+Oh5o93hEみたいな文字列で埋まってるはずです。素晴らしい。また、逆にget_{フィールド名}のメソッドを定義することも可能で、テーブル上に存在しないフィールド名を使用しても問題ありません。下のサンプルは、日本語の日付フォーマットに整形されたデータを取得するサンプル。

<?php 

	public function get_format_registed_date(){
	  $datetime = date_create($this->get_attribute("registed_date"));
	  return date_format($datetime, "Y年m月d日");
	}

	// 整形されたデータが表示されます。
	echo $user->format_registed_date;

他にも苗字と名前を一緒に取得するためのメソッドを定義するなんてことも。

<?php 

class User extends Eloquent {

	public static $table = "user";
	public static $key = "user_id";
	public static $timestamps = false;

	public function get_full_name(){
	  return $this->get_attribute("last_name")." ".$this->get_attribute("first_name");
	}
}

// Yamada Tarou が出力される
$user=User::find(1);
echo $user->full_name;

他のフレームワークにも似たような機能はあるんでしょうが、実に素晴らしいです。