zend framework 2 - thao tác database trong zend framework 2 - bài 8

12

Click here to load reader

Upload: khanhpham

Post on 26-May-2015

1.811 views

Category:

Technology


0 download

DESCRIPTION

Zend Framework 2 - Thao tác Database trong Zend Framework 2 - Bài 8 Để tìm hiểu kỹ hơn các bạn hãy truy cập: Website: www.zend.vn Facebook: facebook.com/zendvngroup Youtube: youtube.com/user/luutruonghailan

TRANSCRIPT

Page 1: Zend Framework 2 - Thao tác Database trong Zend Framework 2 - Bài 8

Thao tác Database trong Zend Framework 2

Xem 'Bài 7 - Nhúng template vào ứng dung ZF2 (P3)' trước khi thực hành bài này

A. Xây dựng 'Admin' MODULE

- Xây dựng MODULE có tên Admin với cấu trúc như sau:

- Bây giờ chúng ta sẽ bắt đầu cấu hình MODULE này

- Mở tập tin /config/application.config.php thêm vào đoạn mã khai báo MODULE mới

<?php

return array(

'modules' => array(

'Application',

'Template',

'Admin'

),

'module_listener_options' => array(

'module_paths' => array(

'./module',

'./vendor',

),

'config_glob_paths' => array(

'config/autoload/{,*.}{global,local}.php',

),

),

Page 2: Zend Framework 2 - Thao tác Database trong Zend Framework 2 - Bài 8

);

- Mở tập tin /module/Admin/config/module.config.php đưa vào nội dung sau: <?php

return array(

'controllers' => array(

'invokables' => array(

'Admin\Controller\Index' => 'Admin\Controller\IndexController'

),

),

'router' => array(

'routes' => array(

'admin' => array(

'type' => 'segment',

'options' => array(

'route' => '/admin[/][:controller][/][:action][/][id/:id]',

'constraints' => array(

'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',

'action' => '[a-zA-Z][a-zA-Z0-9_-]*',

'id' => '[0-9]+',

),

'defaults' => array(

'__NAMESPACE__' => 'Admin\Controller'

'controller' => 'Admin\Controller\Index',

'action' => 'index',

),

),

),

),

),

'view_manager' => array(

'template_path_stack' => array(

'admin' => __DIR__ . '/../view',

),

),

);

- Mở tập tin /module/Admin/Module.php thêm vào nội dung sau: <?php

namespace Admin;

use Zend\Mvc\ModuleRouteListener;

use Zend\Mvc\MvcEvent;

class Module

{

public function onBootstrap(MvcEvent $e)

{

$eventManager = $e->getApplication()->getEventManager();

$moduleRouteListener = new ModuleRouteListener();

$moduleRouteListener->attach($eventManager);

}

public function getConfig()

{

Page 3: Zend Framework 2 - Thao tác Database trong Zend Framework 2 - Bài 8

return include __DIR__ . '/config/module.config.php';

}

public function getAutoloaderConfig()

{

return array(

'Zend\Loader\StandardAutoloader' => array(

'namespaces' => array(

__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,

),

),

);

}

}

- Mở tập tin /module/Admin/src/Admin/Controller/IndexController.php thêm vào nội dung sau: <?php

namespace Admin\Controller;

use Zend\Mvc\Controller\AbstractActionController;

use Zend\View\Model\ViewModel;

class IndexController extends AbstractActionController

{

public function indexAction()

{

echo '<br />' . __METHOD__;

}

}

- Mở tập tin /module/Admin/view/admin/index/index.phtml thêm vào nội dung: <?php echo '<br/>' . __FILE__;?>

- Mở tập tin /module/Admin/view/layout/layout.phtml thêm vào nội dung:

<?php echo $this->doctype(); ?>

<html lang="en">

<head>

<meta charset="utf-8">

</head>

<body>

<h1>Hello Admin</h1>

<?php echo $this->content; ?>

</body>

</html>

- Chạy thử URL localhost:8000/zf2basic/public/admin/ chúng ta sẽ có giao diện sau:

Page 4: Zend Framework 2 - Thao tác Database trong Zend Framework 2 - Bài 8

B. Tạo và kết nối với Database

- Tạo một database có tên ‘zfbasic’

- Tạo một bảng ‘users’ có cấu trúc như sau CREATE TABLE IF NOT EXISTS `users` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`username` varchar(100) NOT NULL,

`email` varchar(255) NOT NULL,

`password` varchar(32) NOT NULL,

`group` varchar(20) NOT NULL DEFAULT 'member',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ;

- Thêm vào bảng ‘users’ một số record để làm dữ liệu tạm INSERT INTO `users` (`id`, `username`, `email`, `password`, `group`) VALUES

(1, 'admin', '[email protected]', '123456', 'admin'),

(2, 'manager', '[email protected]', '123456', 'admin'),

(3, 'user', '[email protected]', '123456', 'member'),

(4, 'user01', '[email protected]', '123456', 'member'),

(5, 'user02', '[email protected]', '123456', 'member'),

(6, 'user03', '[email protected]', '123456', 'member'),

(7, 'user04', '[email protected]', '123456', 'member'),

(8, 'user05', '[email protected]', '123456', 'member'),

(9, 'user06', '[email protected]', '123456', 'member'),

(10, 'user07', '[email protected]', '123456', 'member'),

(11, 'user08', '[email protected]', '123456', 'member'),

(12, 'user09', '[email protected]', '123456', 'member'),

(13, 'user10', '[email protected]', '123456', 'member');

- Bây giờ chúng ta sẽ bắt đầu cấu hình để kết nối Zend Framework với Database

- Tạo thư mục /autoload trong thư mục /config. Thư mục này sẽ chứa các tập tin cấu hình và ứng dụng tự

động load dựa vào đoạn mã trong tập tin /config/application.config.php

//config_glob_paths: là một mảng chứa các tập tin cấu hình của ứng dụng

Page 5: Zend Framework 2 - Thao tác Database trong Zend Framework 2 - Bài 8

'config_glob_paths' => array(

'config/autoload/{,*.}{global,local}.php',

),

- Tạo tập tin /config/autoload/global.php với nội dung sau: <?php

return array(

'db' => array(

'driver' => 'Pdo',

'dsn' => 'mysql:dbname=zfbasic;host=localhost',

'driver_options' => array(

PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES 'UTF8''

),

),

'service_manager' => array(

'factories' => array(

'Zend\Db\Adapter\Adapter'

=> 'Zend\Db\Adapter\AdapterServiceFactory',

),

),

);

- Trong mảng này có 2 phần tử

o ‘db’: Chứa mảng cấu hình kết nối đến hệ cơ sở dữ liệu MySQL

o ‘service_manager’: là một phần tử để chứa cấu hình các thành phần Database, Models, table, Forms,

filters, Authentication.

- Tạo tập tin /config/autoload/local.php, tập tin này chứa thông tin username/password kết nối hệ cơ sở dữ

liệu MySQL với nội dung sau: <?php

return array(

'db' => array(

'username' => 'root',

'password' => '',

),

);

- Sau khi chúng ta tạo 2 tập tin /config/autoload/global.php và /config/autoload/local.php thì 2 mảng cấu

hình này sẽ được load vào ứng dụng.

C. Tạo MODEL và truy xuất dữ liệu trong bảng user

- Trong ZF2 việc truy xuất dữ liệu vẫn sử dụng MODEL nhưng nó được truy xuất qua đối

tượng Zend\ServiceManager\ServiceManager và đối tượng này sẽ không lấy dữ liệu khi luồng xử lý vẫn

còn đang ở trong CONTROLLER và ACTION. Nó sẽ chỉ lấy dữ liệu ở ngoài VIEW mà thôi.

- Trong MODEL của ZF2 chúng ta sẽ phải tạo ra 2 đối tượng đó là:

o Đối tượng quản lý cấu trúc của bảng trong Database

o Đối tượng tương tác với Database

- Đầu tiên chúng ta sẽ tạo ra một thư mục tên /module/Admin/src/Admin/Model để chứa các tập tin tương

Page 6: Zend Framework 2 - Thao tác Database trong Zend Framework 2 - Bài 8

tác đến database

- Kế tiếp chúng ta sẽ tạo ra một đối tượng quản lý cấu trúc của bảng ‘users’ trong Database, tạo tập

tin /module/Admin/src/Admin/Model/User.php có nội dung như sau:

<?php

namespace Admin\Model;

class User

{

public $id;

public $username;

public $email;

public $password;

public $group;

public function exchangeArray($data)

{

$this->id = (!empty($data['id'])) ? $data['id'] : null;

$this->username = (!empty($data['username'])) ? $data['username'] : null;

$this->email = (!empty($data['email'])) ? $data['email'] : null;

$this->password = (!empty($data['password'])) ? $data['password'] : null;

$this->group = (!empty($data['group'])) ? $data['group'] : null;

}

}

- Tiếp theo chúng ta tạo đối tượng tương tác với bảng ‘users’ này để lấy ra Database, tạo tập

tin /module/Admin/src/Admin/Model/UserTable.php có nội dung như sau:

<?php

namespace Admin\Model;

use Zend\Db\TableGateway\TableGateway;

class UserTable

{

protected $tableGateway;

public function __construct(TableGateway $tableGateway)

{

$this->tableGateway = $tableGateway;

}

public function fetchAll()

{

echo __METHOD__;

}

}

- Đối với ZF1 khi chúng ta có MODEL chúng ta có thể nhúng và chạy trực tiếp trong ACTION của

CONTROLLER nhưng đối với ZF2 thì chúng ta sẽ phải chạy thông qua đối

tượng Zend\ServiceManager\ServiceManager vì vậy chúng ta sẽ thêm một số mã nguồn mới vào trong

Page 7: Zend Framework 2 - Thao tác Database trong Zend Framework 2 - Bài 8

tập tin /module/Admin/Module.php

- Thêm vào đầu tập tin một số namespace

// Add these import statements:

use Admin\Model\UserTable;

use Admin\Model\User;

use Zend\Db\ResultSet\ResultSet;

use Zend\Db\TableGateway\TableGateway;

- Tiếp theo chúng ta tạo một phương thức getServiceConfig() trong tập tin này với nội dung sau:

public function getServiceConfig()

{

return array(

'factories' => array(

// DB

'UserTableGateway' => function ($sm) {

//Goi doi tuong ket noi voi Database

$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');

//Goi doi tuong giup chung ta chuyen 1 doi tuong mảng thanh mot doi tuong

$resultSetPrototype = new ResultSet();

$resultSetPrototype->setArrayObjectPrototype(new User());

//$resultSetPrototype = null;

//Dua cac gia tri 'users', $dbAdapter, $resultSetPrototype

//vao doi tuong Zend\Db\TableGateway

return new TableGateway('users', $dbAdapter, null, $resultSetPrototype);

},

'Admin\Model\UserTable' => function($sm) {

//Luc nao UserTableGateway la mot doi tuong cua Zend\Db\TableGateway

//chua cac gia tri ket noi den database va bang chung ta muon truy van

$tableGateway = $sm->get('UserTableGateway');

//Truyen doi tuong Zend\Db\TableGateway vao trong ham __construct()

//cua doi tuong Admin\Model\UserTable

$table = new UserTable($tableGateway);

return $table;

},

),

);

}

- Trong hàm trên chúng ta đã nạp một số đối tượng vào đối

tượng Zend\ServiceManager\ServiceManager khi chúng ta cần dùng đến các đối tượng trên có thể gọi

thông qua đối tượng Zend\ServiceManager\ServiceManager

- Bây giờ chúng ta sẽ bắt đầu lấy dữ liệu của bảng users ra, theo những bước sau:

- Mở tập tin /module/Admin/src/Admin/Model/UserTable.php sửa lại phương thức fetchAll() như sau:

public function fetchAll()

{

//echo __METHOD__;

return $this->tableGateway->select();

}

Page 8: Zend Framework 2 - Thao tác Database trong Zend Framework 2 - Bài 8

- Mở tập tin /module/Admin/src/Admin/Controller/IndexController.php sửa lại indexAction()

public function indexAction()

{

echo '<br />' . __METHOD__;

$userTable = $this->getServiceLocator()->get('Admin\Model\UserTable');

return new ViewModel (array('users' => $userTable->fetchAll()));

}

- Mở tập tin /module/Admin/view/admin/index/index.phtml sửa lại trang như sau:

<?php echo '<br/>' . __FILE__;?>

<?php

foreach ($this->users as $user){

echo "<pre>";

print_r($user);

echo "</pre>";

}

?>

- Chạy thử đường dẫn URL localhost:8000/zf2basic/public/admin/

D. Hiển thị dữ liệu

- Bây giờ chúng ta sẽ xây dựng giao diện để hiển thị danh sách của các User lấy từ bảng ‘users’ trong

database.

- Tạo thư mục /css trong thư mục /public

- Tạo tập tin /public/css/style.css, tập tin này có nội dung như sau:

Page 9: Zend Framework 2 - Thao tác Database trong Zend Framework 2 - Bài 8

#data{

border-collapse:collapse;

border:1px solid #ccc;

width: 800px;

}

#data .title{

text-align: center;

font-weight: bold;

}

#data td, th{

border:1px solid #ccc;

padding: 3px;

}

#data .txtCenter{

text-align: center;

}

.add{

padding: 3px;

margin: 3px 0px;

font-weight: bold;

}

- Mở tập tin /module/Admin/view/layout/layout.phtml chỉnh sửa nội dung lại thành:

<?php echo $this->doctype(); ?>

<html lang="en">

<head>

<meta charset="utf-8">

<?php echo $this->headLink()->prependStylesheet($this->basePath() . '/css/style.css');?>

</head>

<body>

<?php echo $this->content; ?>

</body>

</html>

Trong tập tin này chúng ta đã nhúng tập tin /public/css/style.css nên chúng ta sẽ sử dụng được các định

dạng của tập tin style.css

- Tiếp theo chúng ta sẽ cho danh sách hiển thị ở tập tin VIEW.

- Mở tập tin /module/Admin/view/admin/index/index.phtml đưa vào nội dung sau:

<h1>Danh sách thành viên</h1>

<div id="body"></div>

- Chúng ta thêm nút nhấn có tên “Add a New User” vào tập tin này:

<div class="add">

<?php

$lnkAdd = $this->url('admin',

Page 10: Zend Framework 2 - Thao tác Database trong Zend Framework 2 - Bài 8

array(

'controller'=>'index',

'action'=>'add'

));

$lnkAdd = '<a href="' . $lnkAdd . '">Add a New User</a>';

echo $lnkAdd;

?>

</div>

- Tiếp theo chúng hiển thị danh sách các user và các nút điều khiển như “Edit” và “Delete”

<table id='data'>

<tr class="title">

<td>ID</td>

<td>Username</td>

<td>Email</td>

<td>Group</td>

<td>Control</td>

</tr>

<?php

foreach ($this->users as $user){

$lnkEdit = $this->url('admin',

array(

'controller'=>'index',

'action'=>'edit',

'id' => $user->id

));

$lnkEdit = '<a href="' . $lnkEdit . '">Edit</a>';

$lnkDelete = $this->url('admin',

array(

'controller'=>'index',

'action'=>'delete',

'id' => $user->id

));

$lnkDelete = '<a href="' . $lnkDelete . '">Delete</a>';

$str = '';

$str .= '<tr>';

$str .= '<td class="txtCenter">' . $user->id . '</td>';

$str .= '<td><b>' . $user->username . '</b></td>';

$str .= '<td class="txtCenter">' . $user->email . '</td>';

$str .= '<td class="txtCenter">' . $user->group . '</td>';

$str .= '<td class="txtCenter">' . $lnkEdit . ' | ' . $lnkDelete .'</td>';

$str .= '</tr>';

echo $str;

}

?>

</table>

- Vậy nội dung của tập tin /module/Admin/view/admin/index/index.phtml sau khi thêm đầy đủ sẽ như

sau:

Page 11: Zend Framework 2 - Thao tác Database trong Zend Framework 2 - Bài 8

<h1>Danh sách thành viên</h1>

<div id="body">

<div class="add">

<?php

$lnkAdd = $this->url('admin',

array(

'controller'=>'index',

'action'=>'add'

));

$lnkAdd = '<a href="' . $lnkAdd . '">Add a New User</a>';

echo $lnkAdd;

?>

</div>

<table id='data'>

<tr class="title">

<td>ID</td>

<td>Username</td>

<td>Email</td>

<td>Group</td>

<td>Control</td>

</tr>

<?php

foreach ($this->users as $user){

$lnkEdit = $this->url('admin',

array(

'controller'=>'index',

'action'=>'edit',

'id' => $user->id

));

$lnkEdit = '<a href="' . $lnkEdit . '">Edit</a>';

$lnkDelete = $this->url('admin',

array(

'controller'=>'index',

'action'=>'delete',

'id' => $user->id

));

$lnkDelete = '<a href="' . $lnkDelete . '">Delete</a>';

$str = '';

$str .= '<tr>';

$str .= '<td class="txtCenter">' . $user->id . '</td>';

$str .= '<td><b>' . $user->username . '</b></td>';

$str .= '<td class="txtCenter">' . $user->email . '</td>';

$str .= '<td class="txtCenter">' . $user->group . '</td>';

$str .= '<td class="txtCenter">' . $lnkEdit . ' | ' . $lnkDelete .'</td>';

$str .= '</tr>';

echo $str;

}

?>

</table>

</div>

Chạy thử URL : localhost:8000/zf2basic/public/admin/

Page 12: Zend Framework 2 - Thao tác Database trong Zend Framework 2 - Bài 8

Download source here: http://www.zend.vn/download/pictures/zend-framework-2/05-thao-tac-voi-

database-trong-zf2/05-thao-tac-voi-database-01.zip

Để tìm hiểu kỹ hơn các bạn hãy truy cập:

Website: www.zend.vn

Facebook: facebook.com/zendvngroup

Youtube: youtube.com/user/luutruonghailan