Hướng dẫn tương tác giữa Zend Framework 2 và Database

Hướng dẫn tương tác giữa Zend Framework 2 và Database

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.

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.

Bạn thấy bài viết này như thế nào?: 
Average: 10 (1 vote)
Ảnh của Khanh Hoang

Khanh Hoang - Kenn

Kenn is a user experience designer and front end developer who enjoys creating beautiful and usable web and mobile experiences.

Advertisement

 

jobsora

Dich vu khu trung tphcm

Dich vu diet chuot tphcm

Dich vu diet con trung

Quảng Cáo Bài Viết

 
Google Reader Thêm Nút “Share”

Google Reader Thêm Nút “Share”

Tuy nhiên cách đó sẽ tăng thêm thao tác khi mà chúng ta muốn chia sẻ thông lên. Và nay việc đó sẽ trở lên dễ dàng hơn khi mà Google Reader vừa mang trở lại một nút “Share” hoàn toàn mới...

Hướng dẫn output từ remote drush commands, Drupal 7

Hướng dẫn output từ remote drush commands, Drupal 7

Have you noticed how the output from your remote drush commands wraps at awkward lengths

Tính năng mới như cho phép trả lời một bình luận, gắn thẻ hashtag, chia sẻ cảm xúc trên Facebookcho đầu năm 2013

Tính năng mới như gắn thẻ hashtag, chia sẻ cảm xúc trên Facebookcho đầu năm 2013

Mạng xã hội lớn nhất thế giới liên tục có những thay đổi quan trọng và gây chú ý trong giai đoạn nửa đầu năm 2013, như cho phép trả lời một bình luận, gắn thẻ hashtag, chia sẻ cảm xúc...

Công ty diệt chuột T&C

 

Diet con trung