Módulos¶
O Zend Framework 2 usa um sistema modular atraves do qual você pode organizaro código
principal específico da sua aplicação em cada módulo. O Módulo Application distribuido
com o Sekeleton é usado para a inicialização, gerenciamento de erros e configurações de
roteamento para toda a aplicação. Tmabém é geralmente usado pata prover Controllers no nível
da aplicação, como por exemplo a página incial dessa aplicação, mas nos não iremos usar esse
padrão no tutorial já que queremos que nossa lista de albuns seja nossa página incial, e ela
estará contida no nosso módulo.
Nos iremos colocar todo o nosso código dentro do módulo Album que conterá nossos controllers,
modelos, formulários e views, juntamento com sua configuração Mas também iremos alterar o módulo
Application quando necessário.
Vamos começar com a estrutura de diretórios necessária.
Configurando o Módulo de Album¶
Comece criando um diretório chamado Album dentro do diretório module com os seguintes
subdiretórios que irão conter os arquivos do módulo:
zf2-tutorial/
/module
/Album
/config
/src
/Album
/Controller
/Form
/Model
/view
/album
/album
Como você pode ver o módulo Album tem diretórios independentes para os direferentes
tipos de arquivos que teremos. Os arquivos PHP que contém as classes do Namespace Album
ficam no diretório src/Album, dessa forma podemos utilizar tantos Namespaces no nosso
módulo quanto precisarmos. O diretório de views também tem uma sub-pasta chamada album
para os arquivos de view desse módulo.
Para carregar e configurar os módulos o Zend Framework 2 possui um ModuleManager
(Gerenciador de Módulos). Ele irá procurar pelo arquivo Module.php na raiz do diretório do
seu módulo (module/Album) e espera encontrar um calsse chamada Album\Module dentro dele.
Ou seja, as classes de cada módulo irão conter um namespace com o mesmo nome do módulo,
que também será o nome do diretório do módulo.
Portanto crie o arquivo Module.php no Módulo Album:
Crie um arquivo chamado Module.php no diretório zf2-tutorial/module/Album com o
seguinte código:
<?php
namespace Album;
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements AutoloaderProviderInterface, ConfigProviderInterface
{
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
}
O ModuleManager irá chamar os métodos getAutoloaderConfig() e getConfig()
automaticamente para nós.
Carregamento Automático de Arquivos¶
Nosso método getAutoloaderConfig() retorna um array que é compatível com a
AutoloaderFactory do ZF2. Nós configuramos isso de forma que possamos adicionar um
arquivo com o mapa das classes para o ClassMapAutoloader (mapa de carregamento
automático de classes) e além disso adicionamos o namespace do módulo ao StandardAutoloader
(Carregador automático padrão). O StandardAutoloader solicita um namespace e o
caminho onde estão localizados os arquivos desse namespace. Ele é compatível com o PSR-0
e por isso as classes são direcionadas automaticamente para os arquivos de acordo com as
regras do padrão PSR-0 <https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md>`_.
Como estamos em ambiente de desenvolvimento nos não precisamos incluir as classes pelo mapa de
classes por isso nos iremos retornar apenas um array vazio paa o StandardAutoloader. Crie
um arquivo chamado autoload_classmap.php no diretório ``zf2-tutorial/module/Album``com o
código:
<?php
return array();
Como o array está vazio sempre que o autoloader procrar por uma classe no namespace Album
ele irá retornar pata o StandardAutoloader para nós.
Nota
Se você estiver usando Composer, você pode simplesmente criar um método
getAutoloaderConfig() { } vazio e adcionar o seguinte código ao composer.json:
"autoload": {
"psr-0": { "Album": "module/Album/src/" }
},
Se você fizer dessa forma então terá que rodar php composer.phar update para atualizar os arquivos
de carregamento automático do composer.
Configuração¶
Após ter registrado o autoloader vamos dar uma olhada rápida no método getConfig()
do Album\Module . Esse método simplesmente carrega o arquivo config/module.config.php.
Crie um arquivo chamado module.config.php no diretório zf2-tutorial/module/Album/config:
<?php
return array(
'controllers' => array(
'invokables' => array(
'Album\Controller\Album' => 'Album\Controller\AlbumController',
),
),
'view_manager' => array(
'template_path_stack' => array(
'album' => __DIR__ . '/../view',
),
),
);
A informação de configuração é passada para os componentes relevantes pelo
ServiceManager. Nos iremos precisar de duas seções iniciais: controllers and
view_manager. A seção controllers prove uma lista de todos os controllers
disponíveis no módulo. Nos iremos precisar apenas de um controller, AlbumController,
que iremos referenciar como Album\Controller\Album. A chave do controller deve ser
única por todos os módulos, por isso nos a prefixamos com o nome do módulo.
Na seção view_manager, nos inlcuimos nosso diretório de views na configuração
TemplatePathStack. Isso permitirá que os arquivos de view para o módulo Album
sejam econtrados dentro do nosso diretório view/.
Informando a Aplicação sobre o Novo Módulo¶
Nós agora precisamos infromar ao ModuleManager que nosso novo módulo existe.
Isso é feito no arquivo config/application.config.php da aplicação que está presente
na Aplicação Sekeleton. Altere esse arquivo para incluir na seção modules o módulo
Album juntamente como os demais, dessa forma o arquivo ficará parecido com o seguinte:
(Alterações estão destacadas e com comentários.)
<?php
return array(
'modules' => array(
'Application',
'Album', // <-- Adicione essa linha
),
'module_listener_options' => array(
'config_glob_paths' => array(
'config/autoload/{,*.}{global,local}.php',
),
'module_paths' => array(
'./module',
'./vendor',
),
),
);
Como você pode ver nos adicionamos o módulo Album na lista de módulos
depois do módulo Application.
Nos acabamos de deixar nosso módulo pronto para receber nosso código específico.