Zend Framework - Modelos y base de datos

En este capítulo, discutiremos los diversos modelos y la base de datos del Zend Framework.

Modelos en Zend Framework

Un modelo define la representación lógica de datos de la aplicación. Por ejemplo, en una aplicación de carrito de compras: Producto, Cliente, Carrito y Pedidos son modelos. Definen las propiedades de la entidad que posee. Algunos de los conceptos de modelos son los siguientes:

  • Los controladores se comunican con los modelos y les piden que recuperen la información que necesitan. Esta información recuperada es luego pasada por el controlador a la Vista. Finalmente, View representará el modelo como datos de presentación consumibles por el usuario.

  • Es muy raro que un modelo interactúe directamente con una vista, pero a veces puede suceder.

  • Los modelos pueden hablar entre sí y no son autónomos. Tienen relaciones entre ellos. Estas relaciones hacen que sea más fácil y rápido para un controlador obtener información, ya que no tiene que interactuar con diferentes modelos; los modelos pueden hacerlo ellos mismos.

Echemos un vistazo a un modelo simple: MyModel

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

Base de datos en Zend Framework

Zend framework proporciona una clase simple y rica en funciones, Zend \ Db \ TableGateway \ TableGateway para buscar, insertar, actualizar y eliminar datos de una tabla de base de datos.

Veamos cómo conectar el MySqlservice a través del controlador PDO de PHP en el marco Zend a través de los siguientes pasos.

Paso 1: crear una base de datos en MySQL

Crear base de datos tutorialsen el servidor MySQL local. Nosotros podemos usarphpmyadmino cualquier otra herramienta GUI de MySQL para este propósito. Usemos elMySQL clienten el símbolo del sistema. Conéctese al servidor mysql y ejecute el siguiente comando para crear eltutorial base de datos.

create database tutorials

Paso 2: crear una tabla en la base de datos de tutoriales

Creemos ahora una base de datos book en el tutorials db utilizando el siguiente comando 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) 
);

Paso 3: completar datos en la tabla del libro

Poblar el booktabla con datos de muestra. Utilice el siguiente comando 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');

Paso 4: Actualizar la conexión de la base de datos

Actualice el archivo de configuración global, que es - myapp / config / autoload / global.php con la información de unidad de base de datos necesaria.

<?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', 
      ), 
   ), 
);

Paso 5: actualice las credenciales de la base de datos

Actualice las credenciales de la base de datos en el archivo de configuración local, que es - myapp / config / autoload / local.php. De esta manera, podemos separar las credenciales de conexión de la base de datos local y en vivo.

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

Paso 6: crear modelo para libro

Creemos un modelo, Book en nuestro módulo srcdirectorio. Generalmente, los modelos se agrupan en la carpeta Modelo - /myapp/module/Tutorial/src/Model/Book.php.

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

Paso 7: implementar exchangeArray en el modelo de libro

los TableGateway interactúa con un modelo a través del exchangeArrayfunción. El argumento estándar de la función exchangeArray es el conjunto de resultados de la base de datos almacenado como matriz PHP. Utilizando elexchangeArrayfunction, la propiedad de un modelo se puede sincronizar fácilmente con la tabla de base de datos correspondiente.

Actualizar el modelo Book como se muestra a continuación -

<?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; 
   } 
}

Paso 8: use TableGateway para buscar el libro

Crear una clase, BookTablepara obtener información del libro de la base de datos. Cree la clase, BookTable en elModel carpeta en sí.

<?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; 
   } 
}

Hemos usado select()método de la clase TableGateway para obtener la información del libro de la base de datos. Pero, no hemos utilizado ninguna referencia a la tabla:booken el código. TableGateway es de naturaleza genérica y puede obtener datos de cualquier tabla usando cierta configuración. Por lo general, estas configuraciones se realizan en elmodule.config.php archivo, que discutiremos en los pasos siguientes.

Paso 9: configurar la clase BookTable

Actualiza el módulo tutorial, Module.php con el getServiceConfig() método.

<?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);
            },
         ],
      ];
   }
}

Aquí, hemos registrado el BookTableclase utilizando el administrador de servicios. La clase BookTable se utiliza para obtener la información del libro y, al registrarla, podemos acceder a ella donde sea necesario. Dado que los servicios registrados se comparten, aumentan el rendimiento, reducen el consumo de memoria, etc.

Otro elemento, Model \ BookTableGateway :: class es el objeto TableGateway especializado para Book modelo y es una dependencia del BookTable.

Paso 10: Actualice la configuración del TutorialController

Necesitamos el BookTableservice en el controlador del tutorial para obtener la información del libro. Para obtener el servicio BookTable, regístrelo como dependencia del constructor en TutorialController.

Esta dependencia de Constructor ayuda a obtener el servicio BookTable mientras el propio controlador está en la etapa de inicialización. Actualice la sección del controlador de la configuración del módulo tutorial,module.config.php Como se muestra abajo.

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

Paso 11: Actualizar el controlador del tutorial

Esto se hace siguiendo los siguientes tres pasos.

  • Agregue el constructor con BookTable como argumento.
private $table;
public function __construct(BookTable $table) { 
   $this->table = $table; 
}
  • Obtener información del libro utilizando el BookTable's fetchAll() y regístrelo en la vista.

public function indexAction() { 
   $view = new ViewModel([ 
      'data' => $this->table->fetchAll(), 
   ]);  
   return $view; 
}
  • Muestra la información del libro en el script de visualización.

<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>

Paso 12: ejecutar la aplicación

Verifique la aplicación ejecutando - http://localhost:8080/tutorial.