Учебники

Zend Framework — Модели и база данных

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

Модели в Zend Framework

Модель определяет логическое представление данных приложения. Например, в приложении «корзина» — «Продукт», «Клиент», «Корзина» и «Заказы». Они определяют свойства объекта, который он содержит. Некоторые из концепций моделей следующие:

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

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

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

Контроллеры связываются с моделями и просят их получить необходимую им информацию. Эта полученная информация затем передается контроллером в представление. Наконец, 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, выполнив следующие шаги.

Шаг 1: Создать базу данных в MySQL

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

create database tutorials

Шаг 2: Создать таблицу в уроках БД

Давайте теперь создадим книгу базы данных в учебниках 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: Заполните данные в таблице книг

Заполните таблицу книг образцами данных. Используйте следующую команду 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: Создать модель для книги

Давайте создадим модель, книгу в каталоге нашего модуля src . Обычно модели группируются в папке «Модель» — /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. Используя функцию exchangeArray , свойство модели можно легко синхронизировать с соответствующей таблицей базы данных.

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

<?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 для извлечения информации о книге из базы данных. Но мы не использовали никаких ссылок на таблицу в коде. 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: Обновление учебного контроллера

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

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

Получить информацию о книге, используя метод fetchAll () BookTable, и зарегистрировать ее в представлении.

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 .