Zend Framework - Modelos e banco de dados

Neste capítulo, discutiremos sobre os vários modelos e o banco de dados do Zend Framework.

Modelos no Zend Framework

Um modelo define a representação lógica dos dados do aplicativo. Por exemplo, em um aplicativo de carrinho de compras - Produto, Cliente, Carrinho e Pedidos são modelos. Eles definem as propriedades da entidade que detém. Alguns dos conceitos de modelos são os seguintes -

  • Os controladores se comunicam com os modelos e pedem que recuperem as informações de que precisam. Essa informação recuperada é então passada pelo controlador para a Visualização. Finalmente, o View renderizará o modelo como dados de apresentação consumíveis do usuário.

  • É muito raro que um modelo interaja diretamente com uma visualização, mas às vezes pode acontecer.

  • Os modelos podem conversar uns com os outros e não são independentes. Eles têm relacionamentos um com o outro. Esses relacionamentos tornam mais fácil e rápido para um controlador obter informações, uma vez que ele não precisa interagir com diferentes modelos; os modelos podem fazer isso sozinhos.

Vamos dar uma olhada em um modelo simples - MyModel

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

Banco de dados no Zend Framework

O Zend framework oferece uma classe simples e rica em recursos, Zend \ Db \ TableGateway \ TableGateway, para localizar, inserir, atualizar e excluir dados de uma tabela de banco de dados.

Vamos ver como conectar o MySqlservice via driver PDO do PHP no framework Zend por meio das seguintes etapas.

Etapa 1: Criar banco de dados em MySQL

Criar banco de dados tutorialsno servidor MySQL local. Podemos usarphpmyadminou qualquer outra ferramenta MySQL GUI para este propósito. Vamos usar oMySQL clientno prompt de comando. Conecte-se ao servidor mysql e execute o seguinte comando para criar otutorial base de dados.

create database tutorials

Etapa 2: Criar tabela no banco de dados de tutoriais

Vamos agora criar um banco de dados book no tutorials db usando o seguinte 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) 
);

Etapa 3: preencher dados na tabela de livros

Preencher o booktabela com dados de amostra. Use o seguinte 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');

Etapa 4: Atualizar conexão de banco de dados

Atualize o arquivo de configuração global, que é - myapp / config / autoload / global.php com as informações necessárias da unidade de banco de dados.

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

Etapa 5: atualizar as credenciais do banco de dados

Atualize as credenciais do banco de dados no arquivo de configuração local, que é - myapp / config / autoload / local.php. Dessa forma, podemos separar as credenciais de conexão do banco de dados local e ao vivo.

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

Etapa 6: Criar modelo para livro

Vamos criar um modelo, Book em nosso módulo srcdiretório. Geralmente, os modelos são agrupados na pasta Modelo - /myapp/module/Tutorial/src/Model/Book.php.

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

Etapa 7: Implementar exchangeArray no modelo de livro

o TableGateway interage com um modelo por meio do exchangeArrayfunção. O argumento padrão da função exchangeArray é o conjunto de resultados do banco de dados armazenado como array PHP. Usando oexchangeArrayfunction, a propriedade de um modelo pode ser facilmente sincronizada com a tabela de banco de dados correspondente.

Atualize o modelo, Book como mostrado abaixo -

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

Etapa 8: use o TableGateway para buscar o livro

Crie uma classe, BookTablepara buscar informações do livro no banco de dados. Crie a classe BookTable noModel própria pasta.

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

Nós usamos select()método da classe TableGateway para buscar as informações do livro no banco de dados. Mas, não usamos nenhuma referência à tabela -bookno código. O TableGateway é de natureza genérica e pode buscar dados de qualquer tabela usando certa configuração. Normalmente, essas configurações são feitas nomodule.config.php arquivo, que discutiremos nas etapas subsequentes.

Etapa 9: configurar a classe BookTable

Atualize o módulo do tutorial, Module.php com o 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);
            },
         ],
      ];
   }
}

Aqui, registramos o BookTableclasse usando o gerenciador de serviços. A classe BookTable é usada para buscar as informações do livro e, ao registrá-lo, podemos acessá-lo sempre que necessário. Visto que os serviços registrados são compartilhados, eles aumentam o desempenho, reduzem o consumo de memória, etc.

Outro item, Model \ BookTableGateway :: class é o objeto TableGateway especializado para o Book modelo e é uma dependência do BookTable.

Etapa 10: Atualizar a configuração do TutorialController

Nós precisamos do BookTableserviço no controlador de tutorial para buscar as informações do livro. Para obter o serviço BookTable, registre-o como dependência do construtor no TutorialController.

Essa dependência do Construtor ajuda a obter o serviço BookTable enquanto o próprio controlador está no estágio de inicialização. Atualize a seção do controlador da configuração do módulo tutorial,module.config.php como mostrado abaixo.

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

Etapa 11: Atualizar controlador de tutorial

Isso é feito seguindo as três etapas a seguir.

  • Adicione o construtor com BookTable como argumento.
private $table;
public function __construct(BookTable $table) { $this->table = $table; 
}
  • Busque as informações do livro usando o BookTable's fetchAll() método e registrá-lo na visualização.

public function indexAction() { 
   $view = new ViewModel([ 
      'data' => $this->table->fetchAll(), ]); return $view; 
}
  • Exibe as informações do livro no script de visualização.

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

Etapa 12: execute o aplicativo

Verifique o aplicativo executando - http://localhost:8080/tutorial.