Zend Framework - модели и база данных

В этой главе мы обсудим различные модели и базу данных Zend Framework.

Модели в Zend Framework

Модель определяет логическое представление данных приложения. Например, в приложении корзины покупок - Product, Customer, Cart и Orders являются моделями. Они определяют свойства удерживаемой сущности. Некоторые из концепций моделей следующие:

  • Контроллеры общаются с моделями и просят их получить необходимую информацию. Эта полученная информация затем передается контроллером в представление. Наконец, View будет отображать модель как потребляемые пользователем презентационные данные.

  • Очень редко модель напрямую взаимодействует с представлением, но иногда это может случиться.

  • Модели могут разговаривать друг с другом и не замкнуты. У них отношения друг с другом. Эти отношения упрощают и ускоряют получение информации контроллером, поскольку ему не нужно взаимодействовать с разными моделями; модели могут сделать это сами.

Давайте посмотрим на простую модель - MyModel

<?php  
namespace Tutorial\Model;  
class Book { 
   public $id; public $author; 
   public $title; 
}

База данных в Zend Framework

Zend framework предоставляет простой и многофункциональный класс Zend \ Db \ TableGateway \ TableGateway для поиска, вставки, обновления и удаления данных из таблицы базы данных.

Давайте посмотрим, как подключить MySqlservice через драйвер PHP PDO в Zend framework, выполнив следующие шаги.

Шаг 1. Создайте базу данных в MySQL

Создать базу данных tutorialsна локальном сервере MySQL. Мы можем использоватьphpmyadminили любые другие инструменты MySQL GUI для этой цели. Давайте использоватьMySQL clientв командной строке. Подключитесь к серверу mysql и выполните следующую команду, чтобы создатьtutorial база данных.

create database tutorials

Шаг 2: Создайте таблицу в учебной базе данных

Давайте теперь создадим базу данных book в tutorials db, используя следующую команду SQL.

use tutorials;  
CREATE TABLE book ( 
   id int(11) NOT NULL auto_increment, 
   author varchar(100) NOT NULL, 
   title varchar(100) NOT NULL, 
   PRIMARY KEY (id) 
);

Шаг 3. Заполните данные в таблице книги

Заполните bookтаблица с образцами данных. Используйте следующую команду SQL.

INSERT INTO book (author, title) VALUES ('Dennis Ritchie', 'C Programming'); 
INSERT INTO book (author, title) VALUES ('James gosling', 'Java Programming'); 
INSERT INTO book (author, title) VALUES ('Rasmus Lerdorf', 'Programming PHP');

Шаг 4. Обновление подключения к базе данных

Обновите файл глобальной конфигурации - myapp / config / autoload / global.php, указав необходимую информацию о диске базы данных.

<?php 
return array( 
   'db' => array( 
      'driver' => 'Pdo', 
      'dsn' => 'mysql:dbname = tutorials;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', 
      ), 
   ), 
);

Шаг 5. Обновите учетные данные базы данных

Обновите учетные данные базы данных в локальном файле конфигурации - myapp / config / autoload / local.php. Таким образом, мы можем разделить учетные данные для подключения к локальной и действующей базе данных.

<?php 
return array( 
   'db' => array( 
      'username' => '<user_name>', 
      'password' => '<password>', 
   ), 
);

Шаг 6: Создайте модель для книги

Давайте создадим модель, Book в нашем модуле srcкаталог. Обычно модели сгруппированы в папке Model - /myapp/module/Tutorial/src/Model/Book.php.

<?php  
namespace Tutorial\Model;  
class Book { 
   public $id; 
   public $author; public $title; 
}

Шаг 7. Внедрите exchangeArray в модель книги

В TableGateway взаимодействует с моделью через exchangeArrayфункция. Стандартный аргумент функции exchangeArray - это набор результатов базы данных, хранящийся в виде массива PHP. ИспользуяexchangeArrayfunction, свойство модели можно легко синхронизировать с соответствующей таблицей базы данных.

Обновите модель, Book как показано ниже -

<?php  
namespace Tutorial\Model;  
class Book { 
   public $id; public $author; 
   public $title; public function exchangeArray($data) { 
      $this->id = (!empty($data['id'])) ? $data['id'] : null; $this->Author = (!empty($data['author'])) ? $data['author'] : null; 
      $this->Title = (!empty($data['title'])) ? $data['title'] : null; 
   } 
}

Шаг 8. Используйте TableGateway для получения книги

Создайте класс, BookTableдля получения информации о книге из базы данных. Создайте класс BookTable вModel сама папка.

<?php  
namespace Tutorial\Model;  
use Zend\Db\TableGateway\TableGatewayInterface;  
class BookTable {
   protected $tableGateway; 
   public function __construct(TableGatewayInterface $tableGateway) { $this->tableGateway = $tableGateway; } public function fetchAll() { $resultSet = $this->tableGateway->select(); return $resultSet; 
   } 
}

Мы использовали select()метод класса TableGateway для получения информации о книге из базы данных. Но мы не использовали ссылку на таблицу -bookв коде. TableGateway носит общий характер и может получать данные из любой таблицы, используя определенную конфигурацию. Обычно эти конфигурации выполняются вmodule.config.php файл, который мы обсудим в следующих шагах.

Шаг 9. Настройте класс BookTable

Обновите учебный модуль, Module.php с getServiceConfig() метод.

<?php
namespace Tutorial;
use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Zend\ModuleManager\Feature\ConfigProviderInterface;

class Module implements ConfigProviderInterface {
   
   public function getConfig() {
      return include __DIR__ . '/../config/module.config.php';
   }
   public function getServiceConfig() {
      return [
         'factories' => [
            Model\BookTable::class => function ($container) { $tableGateway = $container->get(Model\BookTableGateway::class); $table = new Model\BookTable($tableGateway); return $table;
            },
            Model\BookTableGateway::class => function ($container) { $dbAdapter = $container->get(AdapterInterface::class); $resultSetPrototype = new ResultSet();
               $resultSetPrototype->setArrayObjectPrototype(new Model\Book()); return new TableGateway('book', $dbAdapter, null, $resultSetPrototype);
            },
         ],
      ];
   }
}

Здесь мы зарегистрировали BookTableкласс с помощью диспетчера служб. Класс BookTable используется для получения информации о книге, и, зарегистрировав ее, мы можем получить к ней доступ в любом месте. Поскольку зарегистрированные службы являются общими, они повышают производительность, уменьшают потребление памяти и т. Д.

Другой элемент, Model \ BookTableGateway :: class, - это объект TableGateway, специализированный для Book модель и является зависимостью BookTable.

Шаг 10: Обновите конфигурацию TutorialController

Нам нужен BookTableв контроллере учебника для получения информации о книге. Чтобы получить службу BookTable, зарегистрируйте ее как зависимость конструктора в TutorialController.

Эта зависимость конструктора помогает получить службу BookTable, пока сам контроллер находится на стадии инициализации. Обновите раздел контроллера конфигурации учебного модуля,module.config.php как показано ниже.

'controllers' => [ 
   'factories' => [ 
      Controller\TutorialController::class => function($container) { 
         return new Controller\TutorialController( 
            $container->get(Model\BookTable::class) 
         ); 
      }, 
   ], 
],

Шаг 11: Обновите Tutorial Controller

Это делается путем соблюдения следующих трех шагов.

  • Добавить конструктор с BookTable в качестве аргумента.
private $table;
public function __construct(BookTable $table) { $this->table = $table; 
}
  • Получить информацию о книге с помощью BookTable's fetchAll() метод и зарегистрируйте его в представлении.

public function indexAction() { 
   $view = new ViewModel([ 
      'data' => $this->table->fetchAll(), ]); return $view; 
}
  • Отобразите информацию о книге в скрипте просмотра.

<table class = "table"> 
   <tr> 
      <th>Author</th> 
      <th>Title</th> 
      <th> </th> 
   </tr> 
   <?php foreach ($data as $sampledata) : ?> 
   <tr> 
      <td><?php echo $this->escapeHtml($data->author);?></td>  
      <td><?php echo $this->escapeHtml($data->title);?></td> 
   </tr> 
   <?php endforeach ?> 
</table>

Шаг 12: Запустите приложение

Проверьте приложение, запустив - http://localhost:8080/tutorial.