12月 202012
 

こんばんは。ファガイです。
本日はある事情により、CodeIgniterを使いそうなので、CodeIgniterの基本的な部分(MVC)を書いた。

Controllerの書き方

基本

class Blog extends CI_Controller {
    public function index()
    {
        echo 'Hello World!';
    }
}

URL

localhost/index.php/blog/メソッド

仕様

  • クラス名は、大文字から始めなければいけない。
  • 親のコントローラクラス(CI_Controller)を継承する必要がある。

_remap()メソッド

_remap()メソッドはアクションメソッドの振る舞いをオーバーライドすることが出来る。
例えば

class Blog extends CI_Controller {
    public function index()
    {
        echo 'Hello!';
    }
    public function add()
    {
        echo 'Hello!2';
    }
    public function _remap($method)
    {
        if ($method == 'test') { //メソッド名がtestであれば
            echo 'Test!';
        }
        else
        {
            echo 'remap!';
        }
    }
}

この場合、blog/indexにも、blog/addにアクセスしても結果は「remap!」が表示される。
しかし、blog/testにアクセスすると「Test!」が表示される。

また、メソッド名以降のセグメントは第二引数として_remap()メソッドに渡される。PHPのcall_user_func_array関数と合わせれば、デフォルト動作を指定できる。

public function _remap($method, $params=array())
{
    $method = 'process_'. $method;
    if(method_exists($this, $method))
    {
        return call_user_func_array(array($this, $method), $params);
    }
    show_404();
}

method_existsは指定したオブジェクトにクラスメソッドが存在するかを調べます。$thisが元々のクラス。
method_exists

call_user_func_array(callable $callback, array $param_arr)

コールバックに、オブジェクトを渡す時は、配列で第1引数に、オブジェクト、第2引数にメソッドを指定しなくてはいけない。

出力クラス

_output()メソッドを使う。第1引数には、処理済のデータが入っている。使い道がイマイチ分からない。

プライベートメソッド

プライベートなメソッドが欲しい時にはメソッドの最初に_をつければ良い。

クラスのコンストラクタ

コンストラクタを使用する際には、絶対にparent::__construct()を入れる必要がある。

class Blog extends CI_Controller {
    public function __construct()
    {
        parent::__construct();
        //これ以降に記述
    }
}

View

ビューを作成する際は、application/views/フォルダ内に保存をする。確か、場所は変えられた気がする
因みに、.phpで保存をする。

ビューの読み込み

ビューを読み込むためには、以下のような書き方をします。

$this->load->view('name');

viewファイルでは.phpと書いていたが、.phpは必要ない。

以下の例では、viewフォルダにblogview.phpがあればそれを読み込みます。

class Blog extends CI_Controller {
    public function index()
    {
        $this->load->view('blogview');
    }
}

この状態でサイトを見ると、viewが適用された状態になるはず。

複数のビューを読み込む

CodeIgniterは複数のビューを読み込むことが出来る。$this->load->view()を書いていった順に処理がされる。例えば、ヘッダービュー、メニュービュー、のような分け方が出来る。

ビューをサブフォルダに保存する

ビューをサブフォルダに保存した時は、パスを変えれば良い。

$this->load->view('folder_name/file_name');

動的にビューにデータを追加する

ビューの読み込みメソッドの第2引数には配列やオブジェクトを渡すことが出来る。つまり、ビューにデータを渡すことが出来ます。

配列を使った例

$data = array(
        'title' => 'My Title',
        'heading' => 'My Heading',
        'message' => 'My Message',
    );
$this->load->view('blogview', $data);

オブジェクトを使った例

$data = new Someclass();
$this->load->view('blogview', $data);

データを渡した後、viewでは、キーと同じ名前で変数に入っている。

echo $title;
echo $heading;

ループの作成

ループをする際には、view内でforeachを使えば良い。

ビューをデータとして返す

ビューをデータとして返したい場合は、読み込みのメソッドの第3引数にtrueを指定すれば良い。通常値はfalseで、自動的にブラウザにデータを出力する設定になっている。

$string = $this->load->view('blogview', '', true);

モデル

モデルはデータを処理するためにあります。データベースにアクセスし、データを取得したり、rssからデータを取得し、整形したり。

CodeIgniterでは以下のような書き方です。(途中からpublicを抜いています。コード制約的にはどうなのか。)

class Blogmodel extends CI_Model {
    var $title = '';
    var $content = '';
    var $date = '';

    function __construct()
    {
        //Modelクラスのコンストラクタを読み出す
        parent::__construct();
    }

    function get_last_ten_entries()
    {
        $query = $this->db->get('entries', 10);
        rteturn $query->result();
    }

    function insert_entry()
    {
        $this->title    = $this->input->post('title');
        $this->content  = $this->input->post('content');
        $this->date     = time();

        $this->db->insert('entries', $this);
    }

    function update_entry()
    {
        $this->title    = $this->input->post('title');
        $this->content  = $this->input->post('content');
        $this->date     = time();

        $id = $this->input->post('id');

        $this->db->update('entries', $this, array('id' => $id));
    }

}

モデルの詳細

モデルは、application/modelsに格納される。
モデルの原型は以下の通り

class Model_name extends CI_Model {
    function __construct()
    {
        parent::__construct();
    }
}
  • クラス名は必ず大文字で始める。
  • ファイル名はクラス名を小文字にしたもの。↑ならmodel_name.php。(user_model.php等)

モデルの読み込み

モデルの読み込みは、

$this->load->model('Model_name');

で、一旦読み込まれると、クラス名と同じ名前のオブジェクトでアクセス出来ます。
モデル名を違う名前に割り当てたい時には、読み込みのメソッドの際に、第2引数で渡すことで指定が出来ます。

$this->load->model('Model_name', 'fubar');

$this->fubar->function();

基本例

class Blog_controller extends CI_Controller {
    function blog()
    {
        //Blogモデルの読み込み
        $this->load->model('Blog');

        $data['query'] = $this->Blog->get_last_ten_entries();

        $this->load->view('blog', $data);
    }
}

モデルの自動読み込み

モデルを自動読み込みさせたい場合は、application/confing/autoload.phpのautoload配列にそのモデルを追加すれば良い。

データベースへの接続

モデルが読み込まれても自動的にはデータベースに接続しません。
予め、データベース設定ファイルに接続情報を設定しておいて、自動接続するかどううかを第3引数に指定することで接続ができます。

$this->load->model('Model_name', '', true);

または、第3引数に、データベースに関数設定を渡しても行うことが出来ます。

$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;

$this->load->model('Model_name', '', $config);

こんな所ですか。
ではでは。

Pocket

 Posted by at 12:42 AM

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*