Práticas recomendadas para os auxiliares do Laravel 4 e funções básicas?

152

Estou tentando entender o melhor lugar para colocar uma função global no Laravel 4. Por exemplo, formatação de data. Não acho que fazer uma fachada valha a pena, pois as fachadas são muito modulares. Eu li artigos sobre como criar uma pasta de biblioteca e armazenar classes lá, mas isso também parece muito para uma função simples. Uma 'ferramenta' como essa não deveria estar disponível nos modelos Blade?

Quais são as práticas recomendadas para algo assim e como faço para disponibilizá-lo aos modelos Blade?

Jason Spick
fonte

Respostas:

233

A maneira feia, preguiçosa e horrível: no final de bootstrap/start.php, adicione include('tools.php')e coloque sua função nesse novo arquivo.

A maneira limpa: Crie uma biblioteca. Dessa forma, ele será carregado automaticamente SOMENTE quando você o usar.

  • Crie uma librariespasta dentro da sua apppasta
  • Crie seu arquivo de biblioteca, crie uma classe nele e adicione funções estáticas a ele
  • Opção 1 : Editar start/global.phppara adicionar app_path().'/libraries'à ClassLoader::addDirectories( matriz.
  • Opção 2 : Editar composer.jsonpara adicionar "app/libraries"à autoloadmatriz. Correcomposer dump-autoload
  • Chame sua classe e funções estáticas de seus pontos de vista.

Sobre suas opções, citadas no global.phparquivo

Além de usar o Composer, você pode usar o carregador de classes Laravel para carregar seus controladores e modelos. Isso é útil para manter todas as suas classes no namespace "global" sem atualizar o Composer.

Você pode combinar as duas opções, nas quais o carregador de classes do Laravel pesquisará automaticamente as classes nos diretórios registrados ( opção 1 , mais fácil) e o Composer manterá o registro de todas as classes, mas somente após a atualização (a opção 2 poderá melhorar o desempenho).

Alexandre Danault
fonte
3
Eu acho que você também tem que colocar app_path().'/library', em start / global.php.
Alexandre Butynski
2
@AlexandreButynski Good point. Isso permitirá adicionar bibliotecas sem precisar atualizar o compositor toda vez. Eu editei minha postagem para adicionar isso.
Alexandre Danault 13/06
Então, eu crio uma classe chamada IDK ... SiteHelpers e defino um método formatDate. e, em seguida, no modelo eu deveria poder fazer SiteHelpers :: formatDate ($ date)?
Jason Spick
@JasonSpick Sim, e certifique-se de nomear o arquivositehelpers.php
Alexandre Danault
3
Por que você precisa adicioná-lo ao carregamento automático do compositor e ao arquivo global.php?
CashIsClay
82

Minha maneira de fazer isso é criar uma nova pasta no /appdiretório na raiz do seu projeto Laravel 4. Em seguida, adicione esta pasta à primeira matriz do /app/start/global.phparquivo da seguinte maneira:

<?php

ClassLoader::addDirectories(array(

app_path().'/commands',
app_path().'/controllers',
app_path().'/models',
app_path().'/database/seeds',
app_path().'/classes', // This line is the one I've added.

));

Contanto que a estrutura da pasta dentro da nova /app/classespasta siga sua convenção de namespacing. O Laravel 4 carregará automaticamente todas as classes / arquivos dentro desta pasta. Dessa forma, não há necessidade de cavar nenhum arquivo do compositor ou executar o comando do compositor.

Não tenho certeza se essa é a melhor prática, mas certamente funciona.

Se você criou um arquivo simples chamado /app/classes/Helpers/Helper.phpcomo este:

<?php namespace Helpers;

class Helper {

    public static function helloWorld()
    {
        return 'Hello World';
    }
}

Tudo o que você precisa fazer é ligar Helpers\Helper::helloWorld();

Você também pode usar o alias dessa classe auxiliar no seu /app/config/app.phparquivo. Basta adicionar algo assim ao final da aliasesmatriz:

'Helper'          => 'Helpers\Helper'
JasonMortonNZ
fonte
4
Eu gosto desse jeito porque você não precisa se misturar com nada do que é compositor, uma solução limpa e elegante. +1
Gadoma 07/09/13
3
Se você adicionasse sua classe auxiliar ao seu arquivo app.php, agora poderá acessar a classe diretamente assim: Helper :: hellowWorld ();
precisa saber é o seguinte
o ajudante deve ser uma classe? posso definir uma função simples aqui?
Webinan
2
Isso não funciona se você não editar o composer.json e não correm compositor dumpautoload
Rommy
1
Ótima solução. Como Rommy diz, não se esqueça de correr composer dump-autoload- eu corri e passei 20 minutos coçando a cabeça.
Al_manchester
25

O método helpers.php do Laravel é adicioná-lo aos seus "arquivos" em composer.json ( https://github.com/laravel/framework/blob/master/composer.json ):

"autoload": {
    "classmap": [
        ...
    ],
    "files": [
        "app/libraries/helpers.php"
    ],
},

O que faço é criar classes pequenas (alguns métodos por classe, uma linha por método, tudo estendido de algo e DRY, esse é o meu objetivo),

class ExtendedCarbon extends Carbon\Carbon {

    public function formatDDMMAAAA($date)
    {
        /// format and return
    }

}

salve-os em app / libraries e adicione a composer.json:

"autoload": {
    "classmap": [
        ...
        "app/libraries",
        ...
    ],
},

Executar

composer dump

E então use-os sempre que precisar

$formatted = (new ExtendedCarbon)->formatDDMMAAAA($date);

Assista a este vídeo sobre refatoração: http://www.youtube.com/watch?v=DC-pQPq0acs

A propósito, tenho certeza de que foi apenas um exemplo, mas talvez você não precise de um ajudante para formatar datas, pois todas as datas no Laravel são instâncias de Carbon ( https://github.com/briannesbitt/Carbon ) e Ele possui vários métodos para formatar data e hora.

Antonio Carlos Ribeiro
fonte
Eu não sou muito fã de métodos estáticos e tento usar métodos de instância quando necessário. Bug Tenho certeza de que, no caso de tal uso, você seria muito melhor de ter formatDDMMAAAA()como static.
XedinUnknown
7

Você também pode usar View::share()junto com fechamentos para conseguir isso - acabei de postar sobre isso: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

Benefício adicional: você não precisa criar uma classe extra e também manter limpo o espaço para nome global.

Franz
fonte
Eu gosto dessa abordagem. Mais ferrovia. Poderíamos, de alguma maneira, adicionar todos os métodos auxiliares de exibição dentro de uma característica e disponibilizá-los na visualização blade?
precisa saber é o seguinte
Não acho que seja possível com o PHP, para ser sincero.
Franz