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.