March 18, 2013

Zend Framework 2 - Access Db via PDO

Zend Framework 2 - access DB
Tiếp nối cho bài viết về Zend Framework 2 - Startup, chỉ đơn giản là cài đặt và chạy bộ khung của ứng dụng ZF2, hôm nay mình sẽ viết tiếp sự tương tác của ZF2 với Database. Cụ thể trong bài này mình sẽ dùng database là Mysql server và bộ thư viện PDO để tương tác. Đại đa số các bài hướng dẫn trên mạng về sự tương tác DB với ZF2 chủ yếu tập trung với việc dùng class TableGateway, bài viết của mình đơn giản hơn là dùng chính PDO để tương tác với MySQL server luôn.
1 - Cấu hình data cho việc kết nối cơ sở dữ liệu
Với ZF2, việc config trở nên đơn giản hơn khi chỉ việc sử dụng array PHP để thực hiện. Bạn thêm vào tập tin global.php trong thư mục config/autoload để config cấu hình database, cũng như thông báo service sẽ dùng cho việc kết nối như bên dưới.
return array(
  'db' => array(
    'driver' => 'Pdo',
    'dsn' => 'mysql:host=localhost;dbname=zf2',
    'driver_options' => array(
      PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'",
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ),
  ),
  'service_manager' => array(
    'factories' => array(
      'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory'
    ),
  ),
);
Đối với ZF2, nó sẽ không wrapper nhiều driver, và nhiều dsn khi dùng Pdo nữa, nên chúng ta phải tự thân vận động, điều này có ích cho ta và cho ứng dụng. Ở bên trên chúng ta cấu hình cho global.php và không có username, password để truy xuất database. Giờ chúng ta thêm file local.php cũng trong thư mục config/autoload như bên dưới.
return array(
  'db' => array(
    'username' => 'root',
    'password' => '',
    'driver_options' => array(
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    ),
  )
);
Tiếp đó, chúng ta sẽ xây dựng tập tin model, làm nhiệm vụ tương tác database. Chúng ta tạo thêm 1 folder Model trong thư mục module/Application/src và tạo luôn file User.php trong thư mục Model này. Nội dung trong file User.php như bên dưới.
<?php
namespace Application\Model;
use Zend\Db\Adapter\Adapter;
use \Exception;
class User
{
  protected $_adapter;
  public function __construct(Adapter $adapter)
  {
    $this->_adapter = $adapter;
  }
  public function getUserByLogin($username, $password)
  {
    try
    {
      $stmt = $this->_adapter->createStatement();
      $sql = "Call sp_login(:p_username, :p_password);";
      $stmt->prepare($sql);
      $result = $stmt->execute(array(
        'p_username' => $username,
        'p_password' => $password,
      ));
      return $result->current();
    }
    catch (Exception $exc)
    {
      var_dump($exc);
    }
  }
}
Việc tiếp theo là chúng ta sẽ cấu hình cho module tự nhận dạng class Model chúng ta vửa thêm bên trên. Mở file Module.php trong thư mục module/Application và bổ sung những phần như comment bên dưới.
<?php
namespace Application;
use Zend\Mvc\ModuleRouteListener;
use Zend\Mvc\MvcEvent;
use Application\Model; // Bổ sung phần này
class Module
{
  // Bổ sung phần này
  public function getServiceConfig()
  {
    return array(
      'factories' => array(
        'Application\Model\User' => function ($sm)
        {
          return new Model\User($sm->get ('Zend\Db\Adapter\Adapter'));
        }
      ),
    );
  }
}
Việc cuối cùng, chúng ta chỉnh sửa một tí IndexController để test tính năng access data này, đoạn code như bên dưới. Chúng ta chỉ cần bổ sung thêm vào file đã có sẵn này.
namespace Application;
public function loginAction()
{
  $username = 'tmquang6805';
  $password = '123456';
  $userModel = $this->getServiceLocator()->get('Application\Model\User');
  $result = $userModel->getUserByLogin($username, $password);
  var_dump($result);
}
Như vậy là xong, mọi người sẽ gặp phải vấn đề là không vào được action login này. Đây là 1 chủ đề khác. Mình sẽ sớm tìm thời gian post lên để mọi người nhanh chóng hòa nhập với Zend Framework 2.

Zend Framework 2 - Startup
Zend Framework 2 - Routing - Part 1
Xem thêm về Zend Framework 2 tại tmquang6805.blogspot.com

No comments:

Post a Comment