Zend Framework 3 - Módulos

Publicado em 12 de Aug 2017.

Hello Devs!!!

O Zend Framework 3 utiliza o sistema de módulos para organizar sua aplicação. O módulo Application contém o esqueleto utilizado para iniciar a aplicação, exibir erros e rotas de configuração. E também contém os controller para aplicação, mas não iremos utilizar esse módulo para nossa aplicação principal.

Pois queremos criar um módulo especializada para organizar nossos álbuns.

Em nosso módulo iremos colocar todo o código, que será controller, models, forms e views. E também as configurações do módulo.

Vamos começar!!!

Setup do módulo

Para começar iremos criar a seguinte estrutura de pastas dentro da pasta module, veja abaixo:

zf-tutorial/
    /module
        /Album
            /config
            /src
                /Controller
                /Form
                /Model
            /view
                /album
                    /album

O módulo album tem pasta separada com diferentes tupo de arquivos. As classes PHP devem conter o namespace Album dentro do diretório /src.

Dentro da pasta view temos uma pasta com o nome de album que irá carregar os scritps.

Em ordem de carregamento e configuração um módulo Zend Framework provém um ModuleManager. Ele irá olhar Module class ontem tem as especificações dos namespaces, no nosso caso Album.

Para informar a nossa aplicação que temos um novo módulo, iremos criar um arquivo com o nome de Module.php que deve ficar no seguinte diretório module/Album/src.

Vamos criar e adicionar o seguinte conteúdo.

namespace Album;

use Zend\ModuleManager\Feature\ConfigProviderInterface;

class Module implements ConfigProviderInterface
{
    public function getConfig()
    {
        return include __DIR__ . '/../config/module.config.php';
    }
}

O ModuleManager irá chamar o método getConfig() automáticamente.

Autocarregamento ou Autoloading

O Zend Framework oferece um componente chamado zend-loader que tem a capacidade de fazer o autoloading de arquivos. E recomendado informar ao Composer sobre a os arquivos do autoloading os arquivos.

Você pode agora abrir o arquivo composer.json que esta na raiz do seu projeto, veja que existe um seção com o nome de autoload.

"autoload": {
    "psr-4": {
        "Application\\": "module/Application/src/"
    }
},

Bem, agora iremos adicionar o novo módulo na lista.

"autoload": {
    "psr-4": {
        "Application\\": "module/Application/src/",
        "Album\\": "module/Album/src/"
    }
},

Uma vez adicionado iremos atualizar as regras do autoload utilizando o seguinte comando.

composer dump-autoload

Configuração

Tendo registrado o autoload, vamos olhar rápidamente o método getConfig() em Album\Module, Este método carrega o arquivo config/module.config.php que fica dentro de /module/Album.

Criaremos agora o arquivo module.config.php dentro zf-tutorial/module/Album/config

namespace Album;

use Zend\ServiceManager\Factory\InvokableFactory;

return [
    'controllers' => [
        'factories' => [
            Controller\AlbumController::class => InvokableFactory::class,
        ],
    ],
    'view_manager' => [
        'template_path_stack' => [
            'album' => __DIR__ . '/../view',
        ],
    ],
];

No arquivo de configuração acima passamos as informações que são relevantes para os componentes por ServiceManager.

Na configuração colocamos duas informações importantes os controllers e view_manager.

Em controllers adicionamos o controller AlbumController nele colocamos o namespace e o nome da classe, o zend-servicemager InvokableFactory irá criar automáticamente as instâncias do nosso controller.

Dentro do view_manager, adicionamos o diretório onde ficará nossas views utilizando o TemplatePathStack. Ele irá buscar onde estão os nosso scripts para o módulo Album.

Informar a aplicação do novo módulo

Nós precisamos que o ModuleManager chave o novo módulo existente. Para isso iremos adicionar uma nova linha no arquivo config/modules.config.php.

Basta adicionar o nome do nosso módulo que no caso é o Album.

return [
    'Zend\Form',
    'Zend\Db',
    'Zend\Router',
    'Zend\Validator',
    'Application',
    'Album',          // <-- Adicionar essa linha
];

Como você pode ver, nós adicionamos um novo módulo em nossa aplicação, agora podemos começar a desenvolver o código de nosso módulo.