Gostaria de criar funções auxiliares para evitar a repetição de código entre visualizações no Laravel 5:
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
Eles são basicamente funções de formatação de texto. Onde e como posso criar um arquivo com essas funções?
php
laravel
laravel-5
laravel-helper
Calebe Oliveira
fonte
fonte
Aulas personalizadas no Laravel 5, o caminho mais fácil
Esta resposta é aplicável a classes personalizadas gerais no Laravel. Para obter uma resposta mais específica do Blade, consulte Diretivas personalizadas do Blade no Laravel 5 .
Etapa 1: Crie seu arquivo Helpers (ou outra classe personalizada) e forneça um espaço para nome correspondente. Escreva sua classe e método:
Etapa 2: Crie um alias:
Etapa 3: executar
composer dump-autoload
na raiz do projetoEtapa 4: use-o no seu modelo Blade:
Crédito extra: use essa classe em qualquer lugar do seu aplicativo Laravel:
Fonte: http://www.php-fig.org/psr/psr-4/
Por que funciona: https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php
De onde se origina o carregamento automático: http://php.net/manual/en/language.oop5.autoload.php
fonte
aliases
matriz emapp/config.php
:'Helper' => App\Helpers\Helper::class,
Então você seria capaz de chamar oHelper::prettyJson();
blade muito bem.meu pensamento inicial também era o carregamento automático do compositor, mas não parecia muito o Laravel para mim. O L5 faz uso pesado de provedores de serviços, eles são o que inicializa seu aplicativo.
Para começar, criei uma pasta no meu
app
diretório chamadaHelpers
. Depois, naHelpers
pasta, adicionei arquivos para as funções que desejava adicionar. Ter uma pasta com vários arquivos nos permite evitar um arquivo grande que fica muito longo e incontrolável.Em seguida, criei um
HelperServiceProvider.php
executando o comando artisan:Dentro do
register
método, adicionei esse trechoPor fim, registre o provedor de serviços no seu
config/app.php
array de provedoresagora qualquer arquivo em seu
Helpers
diretório está carregado e pronto para uso.ATUALIZAÇÃO 22-02-2016
Existem muitas opções boas aqui, mas se minha resposta funcionar para você, fui em frente e fiz um pacote para incluir ajudantes dessa maneira. Você pode usar o pacote como inspiração ou sinta-se à vontade para fazer o download com o Composer. Ele tem alguns auxiliares internos que eu uso frequentemente (mas que estão todos inativos por padrão) e permite que você crie seus próprios auxiliares personalizados com um simples gerador Artisan. Ele também aborda a sugestão que um respondente teve de usar um mapeador e permite definir explicitamente os auxiliares personalizados para carregar ou, por padrão, carregar automaticamente todos os arquivos PHP no diretório auxiliar. Feedback e PRs são muito apreciados!
Github: browner12 / ajudantes
fonte
start.php
arquivo (o que não foi ótimo, mas serviu ao seu propósito na época). você tem outra sugestão para carregar vários arquivos?Isto é o que é sugerido
JeffreyWay
nesta discussão em Laracasts .app/Http
diretório, crie umhelpers.php
arquivo e adicione suas funções.composer.json
, noautoload
bloco, adicione"files": ["app/Http/helpers.php"]
.composer dump-autoload
.fonte
app/helpers.php
ouapp/Helpers/
parece ser um lugar melhor.composer dump-autoload
?composer dump-autoload
você pode seguir o seguinte: desenvolveu.be/2014/08/29/composer-dump-autoload-laravelTendo vasculhado uma variedade de respostas no SO e no Google, ainda não consegui encontrar uma abordagem ideal. A maioria das respostas sugere que deixemos o aplicativo e confiamos no Composer de ferramentas de terceiros para fazer o trabalho, mas não estou convencido de que o acoplamento a uma ferramenta apenas para incluir um arquivo seja sensato.
A resposta de Andrew Brown chegou mais perto de como eu acho que deveria ser abordada, mas (pelo menos na versão 5.1), a etapa do provedor de serviços é desnecessária. A resposta de Heisian destaca o uso
PSR-4
que nos aproxima um passo. Aqui está minha implementação final para os auxiliares nas visualizações:Primeiro, crie um arquivo auxiliar em qualquer lugar do diretório de aplicativos, com um espaço para nome:
Em seguida, alias sua classe em
config\app.php
, naaliases
matriz:E isso deve ser tudo o que você precisa fazer.
PSR-4
e o alias deve expor o auxiliar às suas visualizações, portanto, na sua visualização, se você digitar:Deve produzir:
fonte
{!! bob() !!}
. vamos fazer mais algumas pesquisas e ver se isso é possívelbob()
verdadeiramente global não seria uma coisa sábia a se fazer. Os namespaces existem por um motivo e não devemos chamarbob()
juntamente com as funções básicas do PHP. Vou adicionar seu bit de alias ao meu código - obrigado!extends Helper
? Não parece necessário para mim.extends Helper
fato não é necessário. Obrigado pela atenção.Diretivas personalizadas de lâminas no Laravel 5
Sim, há outra maneira de fazer isso!
Etapa 1: registrar uma diretiva Blade personalizada:
Etapa 2: use sua diretiva Blade personalizada:
Saídas:
ESTA É MINHA DIRETIVA DE LÂMINA PERSONALIZADA !!
Link personalizado
Fonte: https://laravel.com/docs/5.1/blade#extending-blade
Leitura adicional: https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives
Se você quiser aprender a melhor forma de criar classes personalizadas que você pode usar em qualquer lugar , consulte Classes personalizadas no Laravel 5, a maneira fácil
fonte
Este é o meu arquivo HelpersProvider.php:
Você deve criar uma pasta chamada
Helpers
sob aapp
pasta e, em seguida, criar um arquivo chamadowhatever.php
inside e adicionar a stringwhatever
dentro da matriz $ helpers.Feito!
Editar
Não estou mais usando esta opção, atualmente estou usando o compositor para carregar arquivos estáticos como auxiliares.
Você pode adicionar os auxiliares diretamente em:
fonte
glob()
como Andrew Brown escreveu? Se você deseja especificar os arquivos que deseja incluir, por que não especificar os arquivoscomposer.json
para carregá-los automaticamente, como Joseph Silber escreveu? Por que você prefere esta solução? Não estou dizendo que essa é uma solução ruim, só estou curiosa.composer.json
exceto por dois pontos - primeiro, ele mantém o mapa dentro do próprio aplicativo, em vez de um arquivo de metadados; segundo, não é necessário executar novamentecomposer dump-autoload
toda vez que você altera a lista de arquivos para carregar.include
ourequire
, Laravel já foi construído com PSR-4 autoloading: php-fig.org/psr/psr-4Para bibliotecas auxiliares personalizadas no meu projeto Laravel, criei uma pasta com o nome
Libraries
no meuLaravel/App
diretório e, no diretório Bibliotecas, criei vários arquivos para diferentes bibliotecas auxiliares.Depois de criar meus arquivos auxiliares, simplesmente incluo todos esses arquivos no meu arquivo composer.json como este
e executar
fonte
composer dump-autoload
ecomposer dumpautoload
também funciona de factocomposer du
também funcionará ...Como o OP pediu melhores práticas , acho que ainda estamos perdendo alguns bons conselhos aqui.
Um único arquivo helpers.php está longe de ser uma boa prática. Em primeiro lugar, porque você combina muitos tipos diferentes de funções, por isso é contra os bons princípios de codificação. Além disso, isso pode prejudicar não apenas a documentação do código, mas também as métricas de código, como Complexidade Ciclomática , Índice de Manutenção e Volume Halstead . Quanto mais funções você tiver, mais fica pior.
A documentação do código seria OK usando ferramentas como o phpDocumentor , mas usando o Sami, ele não renderiza arquivos procedurais . A documentação da API do Laravel é esse o caso - não há documentação das funções auxiliares: https://laravel.com/api/5.4
As métricas de código podem ser analisadas com ferramentas como PhpMetrics . O uso do PhpMetrics versão 1.x para analisar o código da estrutura do Laravel 5.4 fornecerá métricas CC / MI / HV muito ruins para os arquivos src / Illuminate / Foundation / helpers.php e src / Illuminate / Support / helpers.php .
Vários arquivos auxiliares contextuais (por exemplo , string_helpers.php , array_helpers.php , etc.) certamente melhorariam essas métricas ruins, resultando em um código mais fácil de manter. Dependendo do gerador de documentação de código usado, isso seria bom o suficiente.
Ele pode ser aprimorado ainda mais usando classes auxiliares com métodos estáticos, para que possam ser contextualizadas usando espaços para nome. Assim como o Laravel já faz com
Illuminate\Support\Str
eIlluminate\Support\Arr
classes. Isso melhora as métricas / organização do código e a documentação. Aliases de classe podem ser usados para torná-los mais fáceis de usar.Estruturar com classes melhora a organização e a documentação do código, mas, por outro lado, acabamos perdendo aquelas excelentes funções globais curtas e fáceis de lembrar. Podemos melhorar ainda mais essa abordagem criando aliases de função para esses métodos de classes estáticas. Isso pode ser feito manualmente ou dinamicamente.
O Laravel usa internamente a primeira abordagem declarando funções nos arquivos auxiliares de procedimentos que são mapeados para os métodos de classes estáticas. Isso pode não ser o ideal, pois você precisa redeclarar tudo (docblocks / argumentos).
Eu pessoalmente uso uma abordagem dinâmica com uma
HelperServiceProvider
classe que cria essas funções no tempo de execução:Pode-se dizer que isso acabou com a engenharia, mas acho que não. Funciona muito bem e, ao contrário do que se poderia esperar, não custa tempo de execução relevante, pelo menos ao usar o PHP 7.x.
fonte
Aqui está um script bash shell que criei para fazer as fachadas do Laravel 5 muito rapidamente.
Execute isso no diretório de instalação do Laravel 5.
Chame assim:
Exemplo:
Se você executar esse exemplo, ele criará os diretórios
Facades
eProviders
em 'your_laravel_installation_dir / app / MyApp'.Ele criará os três arquivos a seguir e também os exibirá na tela:
Depois de pronto, ele exibirá uma mensagem semelhante à seguinte:
Portanto, atualize a lista Provedores e alias em 'config / app.php'
Corre
composer -o dumpautoload
O "./app/MyApp/Facades/Helper.php" terá a seguinte aparência:
Agora basta adicionar seus métodos em "./app/MyApp/Facades/Helper.php".
Aqui está o que "./app/MyApp/Facades/Helper.php" se parece depois de adicionar uma função Helper.
Esta função espera um padrão e pode aceitar um segundo argumento booleano opcional.
Se o URL atual corresponder ao padrão passado, ele produzirá 'active' (ou 'class = "active"' se você adicionar 'true' como um segundo argumento à chamada de função).
Eu o uso para destacar o menu que está ativo.
Abaixo está o código fonte do meu script. Espero que você ache útil e informe-me se tiver algum problema.
fonte
em vez de incluir sua classe auxiliar personalizada, você pode realmente adicionar ao seu
config/app.php
arquivo com aliases.deve ser assim.
e depois ao seu Controller, inclua o Helper usando o método 'use Helper' para que você possa simplesmente chamar parte do método na sua classe Helper.
ou na exibição de recursos, você já pode chamar diretamente a classe Helper.
Mas essa ainda é a abordagem do estilo de codificação do desenvolvedor a ser seguida. Podemos ter uma maneira diferente de resolver problemas, e eu só quero compartilhar o que tenho também para iniciantes.
fonte
Criar diretório de auxiliares personalizados: primeiro crie o diretório de auxiliares no diretório de aplicativos. Criar definição de classe hlper: Agora vamos criar uma função auxiliar simples que concatenará duas strings. Crie um novo arquivo MyFuncs.php em /app/Helpers/MyFuncs.php Adicione o seguinte código
espaço para nome App \ Helpers; define o espaço para nome dos auxiliares em espaço para nome do aplicativo. classe MyFuncs {…} define a classe auxiliar MyFuncs. função estática pública full_name ($ first_name, $ last_name) {…} define uma função estática que aceita dois parâmetros de string e retorna uma string concatenada
O serviço de ajudantes fornece classe
Os provedores de serviços são usados para carregar classes automaticamente. Precisamos definir um provedor de serviços que carregará todas as nossas classes auxiliares no diretório / app / Helpers.
Execute o seguinte comando do artesão:
php artisan make: provider HelperServiceProvider
O arquivo será criado em
/app/Providers/HelperServiceProvider.php
Adicione o seguinte código:
AQUI,
Agora precisamos registrar o HelperServiceProvider e criar um alias para nossos auxiliares.
Abrir
/config/app.php
arquivoLocalize a variável de matriz de provedores
Adicione a seguinte linha
Localize a variável de matriz de aliases
Adicione a seguinte linha
Salve as alterações Usando nosso assistente personalizado
Criaremos uma rota que chamará nossa função auxiliar personalizada. Abra /app/routes.php
Adicione a seguinte definição de rota
AQUI,
fonte
Primeiro crie helpers.php dentro do diretório App \ Http. Em seguida, adicione o seguinte código dentro do compositer.json
Em seguida, execute o seguinte comando
Agora você pode definir sua função personalizada dentro do arquivo helpers.php.
fonte
Outra maneira que eu usei foi: 1) criou um arquivo em app \ FolderName \ fileName.php e tinha esse código dentro dele, ou seja
2) Depois disso em nossa lâmina
é isso aí. e funciona
fonte
A melhor prática para escrever auxiliares personalizados é
1) Dentro do
app
diretório da raiz do projeto, crie uma pasta chamada Helpers (Apenas para separar e estruturar o código).2) Dentro da pasta, escreva arquivos psr-4 ou arquivos php normais
Se os arquivos PHP estiverem no formato psr-4, eles serão carregados automaticamente, caso contrário, adicione a seguinte linha no composer.json, que está dentro do diretório raiz do projeto
Dentro da
autoload
chave, crie uma nova chave denominadafiles
para carregar arquivos no momento do carregamento automático, dentro dofiles
objeto adicione o caminho a partir do diretório do aplicativo. Aqui está um exemplo.PS: tente executar
composer dump-autoload
se o arquivo não estiver carregado.fonte
Crie Helpers.php em app / Helper / Helpers.php
Adicionar na atualização do compositor e compositor
usar no controlador
usar na alteração de exibição no arquivo config-> app.php
ligar em vista
fonte
composer.json
será inútil, pois o psr-4 autoload fará o trabalho.no diretório bootstrap \ autoload.php
adicione este arquivo
fonte
**
** criar novo ajudante
Use para o controlador e qualquer arquivo de visualização
fonte
No laravel 5.3 e acima, a equipe do laravel moveu todos os arquivos procedurais (
routes.php
) para fora doapp/
diretório e aapp/
pasta inteira épsr-4
carregada automaticamente. A resposta aceita funcionará neste caso, mas não parece certo para mim.Então, o que eu fiz foi criar um
helpers/
diretório na raiz do meu projeto e colocar os arquivos auxiliares dentro dele, e no meucomposer.json
arquivo eu fiz o seguinte:Desta forma, o meu
app/
diretório ainda é um psr-4, carregado automaticamente, e os ajudantes são um pouco melhor organizados.Espero que isso ajude alguém.
fonte
Existem algumas ótimas respostas aqui, mas acho que essa é a mais simples. No Laravel 5.4 (e provavelmente nas versões anteriores), você pode criar uma classe em algum lugar conveniente para você, por exemplo, App / Libraries / Helper.php
Em seguida, você pode simplesmente chamá-lo no seu modelo Blade assim:
Se você não quiser usar o @inject, faça a função 'uppercasePara' como estática e incorpore a chamada no seu modelo Blade da seguinte maneira:
Não há necessidade de aliases. O Laravel resolve a classe concreta automaticamente.
fonte