トップに戻る ITエンジニア 大和賢一郎
ZF2でデータベースへのアクセスを実装ジッソウする
まず、オートローダーのグローバルを編集ヘンシュウする必要ヒツヨウがある。
たとえば
C:\xampp\htdocs\140321b_NetBeansPrgZF2\config\autoload\global.php
のようなパスになる。
デフォルトのスケルトンの中身ナカミカラっぽである。
下記カキのようにコーディングする。DBメイやホストメイ適宜テキギ変更ヘンコウする。
return array(  
    'db' => array(  
        'driver' => 'Pdo',  
        'dsn'    => 'mysql:dbname=zend_db;host=localhost',  
        'driver_option' => array(  
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''  
        ),  
    ),  
    'service_manager' => array(  
        'factories' => array(  
            'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',  
        ),  
    ),  
);  
ツヅいて、
C:\xampp\htdocs\140321b_NetBeansPrgZF2\config\autoload\local.php
編集ヘンシュウする。
local.php.dist というファイルが既存キゾンであるので、それをコピーしてファイルメイ変更ヘンコウする。
中身ナカミカラっぽなので、下記カキのようにコーディングする。
return array(  
    'db' => array(  
        'username' => 'root',  
        'password' => '',  
    ),  
);  
これはDB接続用セツゾクヨウ(MySQL)のユーザメイとパスワードなので、
環境カンキョウオウじて、適宜テキギ設定セッテイする。
ツヅいて、モデルを作成サクセイする。
まず前提ゼンテイとして、DBに下記カキテーブルが存在ソンザイするものとする。(事前ジゼン作成サクセイしておく)
mysql> desc user;  
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(32) | NO   |     | NULL    |                |
| email | varchar(64) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)  
モデルを格納カクノウするフォルダを作成サクセイする。階層カイソウ下記カキのようになる。
ツヅいて、Model配下ハイカに User.php を作成サクセイする。これはDBのテーブルメイわせる。
User.php に下記カキのコーディングを実装ジッソウする。
namespace Application\Model;  
 
class User  
{  
    public $id;  
    public $name;  
    public $email;      
}  
これはテーブルのカクカラムにわせて変数ヘンスウ定義テイギしている。
ツヅいて、これら変数ヘンスウ初期化ショキカ処理ショリ実装ジッソウする。
下記カキのとおり、Userクラスのメソッドとして実装ジッソウする。
    public function exchangeArray($data)  
    {  
      $this->id    = (isset($data['id'])) ? $data['id'] : 0;  
      $this->name  = (isset($data['name'])) ? $data['name'] : '';  
      $this->email = (isset($data['email'])) ? $data['email'] : '';  
    }  
ツヅいて、UserTable.php を作成サクセイする。
階層カイソウ下記カキ場所バショになる。(Modelフォルダ配下ハイカ
下記カキのコーディングを実装ジッソウする。
<?php  
 
namespace Application\Model;  
use Zend\Db\TableGateway\TableGateway;  
 
class UserTable  
{  
    protected $tableGateway;  
      
    public function __construct(TableGateway $tableGateway) {  
        $this->tableGateway = $tableGateway;  
    }  
      
    public function fetchAll(){  
        $resultSet = $this->tableGateway->select();  
        return $resultSet;  
    }  
      
    public function getUser($id){  
        $id = (int)$id;  
        $rowset = $this->tableGateway->select(array('id' => $id));  
        $row = $rowset->current();  
        if(!$row){  
            throw new Exception('Could not find row $id');  
        }  
        return $row;  
    }  
      
    public function saveUser(User $user){  
        $data = array(  
            'name'  => $user->name,  
            'email' => $user->email,  
        );  
        $id = (int)$user->id;  
        if($id == 0){  
            $this->tableGateway->insert($data);  
        } else {  
            if($this->getUser($id)){  
                $this->tableGateway->update($data,array('id' => $id));  
            } else {  
                throw new Exception('Form id does not exist');  
            }  
        }  
    }  
 
    public function deleteUser($id){  
        $this->tableGateway->delete(array('id' => $id));  
    }  
      
}  
 
ツヅいて、Module.php を実装ジッソウする。
C:\xampp\htdocs\140321b_NetBeansPrgZF2\module\Application\Module.php
既存キゾン下記カキのようになっている。
これにタイして、まず use を追加ツイカする。
use Zend\Db\ResultSet\ResultSet;  
use Zend\Db\TableGateway\TableGateway;  
use Application\Model\UserTable;  
use Application\Model\User;  
さらに、下記カキ追加ツイカする。
    public function getServiceConfig(){  
        return array(  
            'factories' => array(  
                'Application\Model\UserTable' => function($sm){  
                    $tableGateway = $sm->get('UserTableGateway');  
                    $table = new UserTable($tableGateway);  
                    return $table;  
                },  
                'UserTableGateway' => function($sm){  
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');  
                    $resultSetPrototype = new ResultSet();  
                    $resultSetPrototype->setArrayObjectPrototype(new User());  
                    return new TableGateway(  
                            'user', $dbAdapter, null, $resultSetPrototype  
                    );  
                },  
            ),  
        );  
    }  
ツヅいて、UserController.php を新規シンキ作成サクセイして、下記カキのように実装ジッソウする。
<?php  
 
namespace Application\Controller;  
 
use Zend\Mvc\Controller\AbstractActionController;  
use Zend\View\Model\ViewModel;  
use Application\Model\User;  
 
class UserController extends AbstractActionController  
{  
    protected $userTable;  
      
    public function addAction()  
    {  
        // 新規ユーザの追加  
        $user = new User();  
        $user->name = "hoge-taro";  
        $user->email = "hoge@hoge.com";  
        $this->getUserTable()->saveUser( $user );  
    }  
      
    public function getUserTable()  
    {  
        if(!$this->userTable){  
            $sm = $this->getServiceLocator();  
            $this->userTable = $sm->get('Application\Model\UserTable');  
        }  
        return $this->userTable;  
    }  
      
}  
 
C:\xampp\htdocs\140321b_NetBeansPrgZF2\module\Application\config\module.config.php
以下イカ追記ツイキする。
,'Application\Controller\User' => 'Application\Controller\UserController'
ビューに user フォルダを作成サクセイし、 add.phtml を作成サクセイする。
中身ナカミ適当テキトウなHTMLをコーディングする。
http://localhost/140321b_NetBeansPrgZF2/public/application/user/add
にアクセスする。DBにレコードが追加ツイカされていればOK。
mysql> select * from user  
    -> ;  
+----+-----------+---------------+  
| id | name      | email         |  
+----+-----------+---------------+  
|  1 | hoge-taro | hoge@hoge.com |  
+----+-----------+---------------+  
1 row in set (0.00 sec)  
以上イジョウ