Kohana 3.0の紹介-パート4

Kohana PHP V3(KO3)を使用した一連の開発記事の第4部をご覧ください。 前のパーツは、「 kohana 3.0に慣れている 」というラベルの下にあります。 今回は、モデルの操作に焦点を当てます。



Kohana 2.xのドキュメントからモデルの定義を取得します。

モデルは、コントローラーによって送信または要求された情報を処理するように設計されたクラスです。 たとえば、ゲストブックがある場合、コントローラーは最後の10エントリのモデルを要求します。 モデルはそれらを返します。 コントローラーはこのデータを心に渡します。 コントローラーは、モデルを使用して新しいレコードを追加し、既存のレコードを更新または削除することもできます。


本質的に、モデルはデータ操作子です。



まず最初に、XMLテープ、CSV、JSON、DBなどのデータを決定する必要がありますか? 気にせず、今回はMySQLの古くからの友人と仕事をします。 したがって、次のステップはデータベースへの接続を構成することです。



ブートファイル(「application / bootstrap.php」)を開き、「// 'database' => MODPATH.'database '、// Database access」の行を見つけてコメント解除します。 ブロック全体は次のようになります。



Kohana::modules(array( // 'auth' => MODPATH.'auth', // Basic authentication // 'codebench' => MODPATH.'codebench', // Benchmarking tool 'database' => MODPATH.'database', // Database access // 'image' => MODPATH.'image', // Image manipulation // 'orm' => MODPATH.'orm', // Object Relationship Mapping // 'pagination' => MODPATH.'pagination', // Paging of results // 'userguide' => MODPATH.'userguide', // User guide and API documentation ));
      
      







ファイルを保存します。 データベースモジュールをロードするようにフレームワークを注文しましたが、まだ構成されていません。 「database.php」を「modules / database / config /」から「application / config /」にコピーします。 「application / config / database.php」ファイルを開き、設定に従って編集します。 私はこのように見えます:



 <?php defined('SYSPATH') OR die('No direct access allowed.'); return array ( 'default' => array ( 'type' => 'mysql', 'connection' => array( /** * The following options are available for MySQL: * * string hostname * integer port * string socket * string username * string password * boolean persistent * string database */ 'hostname' => 'localhost', 'username' => 'root', 'password' => FALSE, 'persistent' => FALSE, 'database' => 'mykohana3', ), 'table_prefix' => '', 'charset' => 'utf8', 'caching' => FALSE, 'profiling' => TRUE, ), 'alternate' => array( 'type' => 'pdo', 'connection' => array( /** * The following options are available for PDO: * * string dsn * string username * string password * boolean persistent * string identifier */ 'dsn' => 'mysql:host=localhost;dbname=mykohana3', 'username' => 'root', 'password' => FALSE, 'persistent' => FALSE, ), 'table_prefix' => '', 'charset' => 'utf8', 'caching' => FALSE, 'profiling' => TRUE, ), );
      
      







ファイルを保存します。 この一連の記事では、データベース「mykohana3」を作成しました。同じことをお勧めします。 次のSQLコードを使用して、データベースにテーブルを作成します。



 CREATE TABLE `posts` ( `id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT, `title` VARCHAR(255) DEFAULT NULL, `post` TEXT, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC;
      
      







お気に入りのMySQLクライアントで実行します。個人的にはSQLYogを好みます。 データベースに接続する構成とテーブルの両方で、エンコーディング「utf8」を設定します。 これは将来必要になります。



「アプリケーション/クラス」に新しいフォルダー「モデル」を作成しましょう。 その中に、新しいファイルを作成し、そこに以下を置きます:



 <?php defined('SYSPATH') or die('No direct script access.'); class Model_Post extends Kohana_Model { /** * Get the last 10 posts * @return ARRAY */ public function getLastTenPosts() { $sql = 'SELECT *'."\n". 'FROM `posts`'."\n". 'ORDER BY `id` DESC'."\n". 'LIMIT 0, 10'; return $this->_db->query(Database::SELECT, $sql, FALSE) ->as_array(); } }
      
      







これを「post.php」として「application / classes / model /」に保存します。 次に、コードを1行ずつ解析します。



 $sql = 'SELECT *'."\n". 'FROM `posts`'."\n". 'ORDER BY `id` DESC'."\n". 'LIMIT 0, 10';
      
      







これは、データベースから最大10個のレコードを選択する基本的なMySQLクエリであり、「id」フィールドで降順にソートされます。



 return $this->_db->query(Database::SELECT, $sql, FALSE) ->as_array();
      
      







これは、リクエストの結果を含む配列を返します。 この例のクエリメソッドは、3つのパラメーターを取ります。 1つ目はクエリのタイプで、「選択」しているため、定数「データベース:: SELECT」を渡します。 他にも3つあります:「Database :: INSERT」、「Database :: UPDATE」、および「Database :: DELETE」。 as_array()メソッドは結果を含む配列を返すため、while($ row = mysql_fetch_array())を行う必要はありません。



モデルにメソッドができたので、使用を開始できます。 「/ application / classes / controller」で「ko3.php」を開き、次のコードをクラスに追加します。



 public function action_posts() { $posts = new Model_Post(); $ko3 = array(); $this->template->title = 'Kohana 3.0 Model Test'; $this->template->meta_keywords = 'PHP, Kohana, KO3, Framework, Model'; $this->template->meta_description = 'A test of of the KO3 framework Model'; $this->template->styles = array(); $this->template->scripts = array(); // Get the last 10 posts $ko3['posts'] = $posts->getLastTenPosts(); $this->template->content = View::factory('pages/posts', $ko3); }
      
      







モデルからgetLastTenPosts()メソッドを呼び出し、それによって返された値を配列に入れ、それをビューに渡しました。 ビューといえば、新しいファイルを開いてそこに置きます:



 <?php foreach($posts as $post):?> <h1><?php echo $post['title'];?></h1> <?php echo $post['post'];?> <hr /> <?php endforeach;?>
      
      







これを「posts.php」として「application / views / pages /」フォルダーに保存します。 このビューは、コントローラーによって送信された配列を反復処理し、データベースのレコードを表示します。 ただし、データベースにはまだ記事がありません! これを次のSQLクエリで修正します。



 insert into `posts`(`id`,`title`,`post`) values (1,'Test Post','This is some sample text.'); insert into `posts`(`id`,`title`,`post`) values (2,'Another post','Some more text');
      
      







「http:// localhost / mykohana3 / ko3 / posts」というアドレスに移動すると、2つのエントリが表示されます。



次に、データベースへの新しいデータの追加を実装しましょう。 モデル(「application / classes / model / post.php」)を開き、クラスに次を追加します。



 public function addPost($title, $post) { $sql = sprintf('INSERT INTO `posts`'."\n". 'SET `title` = %s,'."\n". ' `post` = %s', $this->_db->escape($title), $this->_db->escape($post)); $this->_db->query(Database::INSERT, $sql, FALSE); }
      
      







上記はかなり単純なINSERTリクエストですが、「$ this-> _ db> escape()」とは何ですか? このメソッドは、文字列変数を引用符で囲み、ゴミを取り除きます。 これを保存して、「application / views / pages」から「posts.php」に戻ります。 内容をこれに置き換えます:



 <?php if(!empty($msg)):?> <?php echo $msg.'<br />';?> <?php endif;?> <?php foreach($posts as $post):?> <h1><?php echo $post['title'];?></h1> <?php echo $post['post'];?> <hr /> <?php endforeach;?> <form method="POST" action="<?php echo url::base();?>ko3/posts/"> <table> <tr> <td> Title </td> <td> <input type="text" name="title" style="border: 1px solid #000000;"/> </td> </tr> <tr> <td> Post </td> <td> <textarea cols="20" rows="5" name="post"></textarea> <input type="submit" name="submit" value="Submit"/> </td> </table> </form>
      
      







ファイルを保存し、コントローラーを開きます(「application / classes / controller / ko3.php」)。 新しいメソッドを追加します:



 private function _addPost($title, $post_content) { // Load model $post = new Model_Post(); // Check required fields if(empty($title)) { return(array('error' => 'Please enter a title.')); } elseif(empty($post_content)) { return(array('error' => 'Please enter a post.')); } // Add to DB $post->addPost($title, $post_content); return TRUE; }
      
      







このコードは、「action_posts」とモデルの間の中間リンクであり、レコードを直接保存するのに役立ちます。 action_postsメソッドに戻って、このフォームを表示します。



 public function action_posts() { // Load model $posts = new Model_Post(); // Setup view stuff $ko3 = array(); $this->template->title = 'Kohana 3.0 Model Test'; $this->template->meta_keywords = 'PHP, Kohana, KO3, Framework, Model'; $this->template->meta_description = 'A test of of the KO3 framework Model'; $this->template->styles = array(); $this->template->scripts = array(); $ko3['msg'] = ""; // Handle POST if($_POST) { $ret = $this->_addPost((isset($_POST['title']) ? $_POST['title'] : ""), (isset($_POST['post']) ? $_POST['post'] : "")); if(isset($ret['error'])) { $ko3['msg'] = $ret['error']; } else { $ko3['msg'] = 'Saved.'; } } // Get the last 10 posts $ko3['posts'] = $posts->getLastTenPosts(); // Display it. $this->template->content = View::factory('pages/posts', $ko3); }
      
      







これを保存してブラウザを再起動します。 怖い形が下に表示されます。 何かを入力して「送信」をクリックします。 両方のフィールドに入力した場合、エントリは「Saved」という碑文とともに上部に表示されます。 それ以外の場合は、エラーメッセージが表示されます。



モデルに慣れる前に、他の方法でデータベースにエントリを追加する方法を示したいと思います。 いくつかの方法がありますが、私はいわゆるクエリービルダーにのみ注意を払います。 addPost()メソッドのMySQLクエリは次のようになります。



 public function addPost($title, $post) { DB::insert('posts', array('title','post')) ->values(array($title, $post)) ->execute(); }
      
      







クエリビルダは、さまざまな種類のデータベース(MySQLからOracleなど)を切り替えることができるという点で特に便利です。



モデルのレコードの更新は実装していませんので、これを宿題と見なしてください。



All Articles