CodeIgniter 3を使用する際、モデルはデータベースとのやり取りを担う重要な役割を果たします。しかし、複数のモデル間で共通する処理を繰り返し記述すると、コードが冗長になり、保守性が低下してしまいます。そこで今回は、コアクラスを拡張して、複数のモデルで共通の機能を簡単に利用できる方法をご紹介します。このテクニックを使うことで、開発の効率が大幅に向上します。
MY_Modelという共通ベースモデルを作成する
CodeIgniterでは、MY_
プレフィックスをつけたファイルを作成することで、フレームワークのコアクラスを拡張できます。これを利用して、全てのモデルに共通する機能をまとめたベースモデルを作成しましょう。
ステップ
コアクラスにベースモデルを作成
application/core/MY_Model.php
というファイルを作成し、共通のロジックを記述します。
<?php
class MY_Model extends CI_Model {
public function __construct() {
parent::__construct();
}
public function find($id, $table) {
return $this->db->where('id', $id)->get($table)->row();
}
public function get_all($table) {
return $this->db->get($table)->result();
}
public function insert($table, $data) {
return $this->db->insert($table, $data);
}
public function update($id, $table, $data) {
return $this->db->where('id', $id)->update($table, $data);
}
public function delete($id, $table) {
return $this->db->where('id', $id)->delete($table);
}
}
モデルでベースモデルを継承
例えば、User_model
や Product_model
などのモデルでこの共通ベースモデルを継承します。
class User_model extends MY_Model {
protected $table = 'users';
public function __construct() {
parent::__construct();
}
public function get_active_users() {
return $this->db->where('status', 'active')->get($this->table)->result();
}
}
モデル内での共通処理を簡素化する
ベースモデルを作成することで、データベース操作に関する共通処理を各モデルで簡単に行えるようになります。特に、テーブル名を各モデルで設定し、ベースモデルのメソッドで利用することで、コードが大幅に短縮されます。
class MY_Model extends CI_Model {
protected $table;
public function find($id) {
return $this->db->where('id', $id)->get($this->table)->row();
}
public function get_all() {
return $this->db->get($this->table)->result();
}
public function insert($data) {
return $this->db->insert($this->table, $data);
}
public function update($id, $data) {
return $this->db->where('id', $id)->update($this->table, $data);
}
public function delete($id) {
return $this->db->where('id', $id)->delete($this->table);
}
}
共通のバリデーションルールをベースモデルに追加
各モデルでよく使うバリデーションを共通化するために、ベースモデルにバリデーションルールを追加します。これにより、モデルごとのコードの重複を避け、管理しやすくなります。
ベースモデルにバリデーションルールを追加
class MY_Model extends CI_Model {
protected $table;
protected $validation_rules = array();
public function __construct() {
parent::__construct();
$this->load->library('form_validation');
}
public function validate($data) {
$this->form_validation->set_data($data);
$this->form_validation->set_rules($this->validation_rules);
if ($this->form_validation->run() == FALSE) {
return $this->form_validation->error_array();
} else {
return TRUE;
}
}
}
モデルごとのバリデーションルール設定例
class User_model extends MY_Model {
protected $table = 'users';
public function __construct() {
parent::__construct();
$this->validation_rules = array(
array(
'field' => 'name',
'label' => 'Name',
'rules' => 'required'
),
array(
'field' => 'email',
'label' => 'Email',
'rules' => 'required|valid_email'
)
);
}
}
まとめ
これらのテクニックを使うことで、CodeIgniter 3でのモデル管理が簡単かつ効率的になります。共通処理をベースモデルにまとめることで、コードの重複を減らし、保守性を向上させることができます。ぜひ、これらの技を活用して、より良い開発環境を整えてください。
コメント