Trabalhando com módulos – Criando as camadas: Admin e CMS 5

Link do primeiro tutorial: http://www.laravel.com.br/entendendo-e-trabalhando-com-modulos-no-laravel-4-2/

Olá, como prometido estou escrevendo a segunda parte do tutorial que veremos como obter o seguinte resultado de estrutura:

    • assets
    • controllers
    • views
    • models
    • lang
    • routes.php
    • CmsServiceProvider.php

Observação: Antes de prosseguir, por favor, criem as pastas e os arquivos de provider que mencionei a cima:

  • app/modules/CMS/assets
  • app/modules/CMS/CmsServiceProvider.php

Exemplo: https://github.com/michaeldouglas/modulos-laravel/tree/master/app/modules/CMS

A primeira alteração que vocês deverão fazer é no arquivo:

  • app/modules/CMS/module.json

Deixando o arquivo com a seguinte estrutura:

{
"order": 2,
"enabled": true,
"provider": [
"App\\Modules\\Cms\\CmsServiceProvider"
],
"include": [
"breadcrumbs.php"
]
}

Instruções contidas no arquivo app/modules/CMS/module.json:

  • order: Informa a ordenação de seus módulos.
  • Enabled: Informa que esse módulo esta ativo e pronto para ser usado.
  • Provider: Informa sobre qual provider o seu módulo irá trabalhar.
  • Include: São arquivos que podem ser incluidos para o seu módulo.

No arquivo:

  • app/modules/CMS/CmsServiceProvider.php

Coloque o  seguinte código:

    namespace App\Modules\Cms;

    class CmsServiceProvider extends \Illuminate\Support\ServiceProvider
    {

    public function register()
    {
    \Log::debug("CMS registrado");

    // Registros que podem ser feitos a iniciar o provider
    $this->app->booting(function() {

    });
    }

    }
    

Após criar o arquivo execute em seu terminal o comando:

  • composer dump

Em seguida o comando:

  • php artisan config:publish creolab/laravel-modules

E para finalizar verifique se as sua configurações estão corretas executando:

  • php artisan modules – Esse comando irá retornar seus módulos criados

Agora altere o arquivo:

  • app/start/global.php
/*
|--------------------------------------------------------------------------
| Register The Laravel Class Loader
|--------------------------------------------------------------------------
|
| In addition to using Composer, you may use the Laravel class loader to
| load your controllers and models. This is useful for keeping all of
| your classes in the "global" namespace without Composer updating.
|
*/
ClassLoader::addDirectories(array(
app_path().'/modules/CMS/controllers',
app_path().'/modules/Admin/controllers',
app_path().'/commands',
app_path().'/controllers',
app_path().'/models',
app_path().'/database/seeds',

));

Agora iremos criar nossas rotas, controllers, layout, assets e view.

Crie o seu arquivo de controller com o seguinte nome:

  • app/modules/CMS/controllers/CMSHomeController.php

Em seu arquivo de controller coloque o seguinte código:

class CMSHomeController extends BaseController {
public function home(){
return View::make('CMS::home.home');
}
}

Crie duas pastas na sua camada View do CMS:

  • modules/CMS/views/home
  • modules/CMS/views/layout

E os arquivos:

  • modules/CMS/views/home/home.blade.php
  • modules/CMS/views/layout/master.blade.php

Em seu arquivo:

  • modules/CMS/view/layout/master.blade.php

Você colocará o seguinte código:

<html>
    <body>
        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

E no arquivo

  • modules/CMS/view/home/home.blade.php

você colocará o seguinte código:

@extends('CMS::layout.master')

@section('content')
<p>Hello World!</p>
<p>Conteúdo do CMS!</p>
@stop

Observação: Vocês notaram que ao estender o layout no arquivo home.blade.php foi acrescentado:

  • CMS::

Isso foi necessário por que precisamos informar a qual view/modules estaremos trabalhando, no caso do admin será colocado:

  • Admin::

Abra o arquivo:

  • app/modules/CMS/routes.php

Escreva a seguinte rota:

Route::get('/cms', ['uses' => '[email protected]']);

Se ao chamar a aplicação com a rota:

  • http://<oSeuIpServidor>/cms

Você visualizar a seguinte mensagem:

  • hello world!
  • Conteúdo do CMS!

Significa que as configurações foram feitas corretamente e o seu Laravel já pode ser utilizado com o conceito de camadas.

Observação: Todos os conceitos aplicados no CMS servem para o admin só é necessário alterar de CMS para admin.

E por último irei mostrar como inserir um CSS em sua camada CMS:

Agora crie um arquivo css na pasta:

  • app/modules/CMS/assets/css

Eu colocarei o seguinte nome de arquivo:

  • app/modules/CMS/assets/css/geral.css

Após criar o arquivo execute em seu terminal o comando:

  • php artisan modules:publish CMS

Esse comando ira gerar na sua pasta public a estrutura de assets com o seguinte caminho e nome:

  • packages/module/cms/assets/css/

Altere seu arquivo de layout:

  • app/modules/CMS/views/layout/master.blade.php

Coloque a seguinte instrução:

<head>
    @section('styles_cms')

    @show
</head>

E no seu arquivo da home:

  • app/modules/CMS/views/home/home.blade.php

Coloque a chamada para a sua asset:

@section('styles_cms')
@parent
{{ HTML::style('packages/module/cms/assets/css/geral.css', array('type' => 'text/css')) }}
@stop

Como isso você já tem o arquivo de css do seu CMS, e para as imagens e javascript será o mesmo conceito.

Observação: Todos os arquivos deverão ser criados na sua pasta de assets, por exemplo no CMS sempre ficará no caminho:

  • app/modules/CMS/assets
  • E para o admin: app/modules/admin/assets

Eu espero ter ajudado a todos, qualquer dúvida segue o exemplo dos códigos no GitHub:
https://github.com/michaeldouglas/modulos-laravel

Meu e-mail: [email protected]

Um grande abraço a todos.

IMG-20141216-WA0000

  • William Novasky

    Olá Michael,

    Nesse caso de módulos, como eu faria para ter o módulo CMS como o default da aplicação para, por exemplo, acessar http://www.meusite.com.br/ e já acessar o módulo CMS sem que o mesmo apareça nas rotas da URL?

    Nesse caso eu deveria manter o ‘default’ na raiz do app/ mesmo?

    Abraço.

    • Rafael Mignoni

      Olá William,

      Me encontrei com a mesma duvida.
      Ja conseguiu uma resposta para isso?

      Ou seria o caso de apenas tratar as rotas do cms no arquivo “app/routes.php”, em vez de em “app/modules/CMS/routes.php”?

      • William Novasky

        Olá Rafael,

        Bom, estou trabalhando com o módulo “default” na raiz mesmo. Para o módulo admin, utilizo o método citado acima mesmo.

  • Lucas Soares

    Olá Michael, tudo bem?….Estou começando a estudar o Laravel e sobre os módulos gostaria de tirar uma dúvida…Eh possível criar uma sistema com autenticação e definir quais os módulos que o usuário tem acesso e quais permissões o mesmo possui em cada módulo (exemplo: cadastrar, consultar, deletar, etc)? Obrigado para parabéns pelo trabalho….

  • Dinaerte Neto

    o comando abaixo não funciona:

    php artisan config:publish creolab/laravel-modules

    [SymfonyComponentConsoleExceptionCommandNotFoundException]
    Command “config:publish” is not defined.
    Did you mean one of these?
    vendor:publish
    config:clear
    config:cache