Лучшие практики для пользовательских помощников в Laravel 5

351

Я хотел бы создать вспомогательные функции, чтобы избежать повторения кода между представлениями в Laravel 5:

view.blade.php

<p>Foo Formated text: {{ fooFormatText($text) }}</p>

Это в основном функции форматирования текста. Где и как я могу создать файл с этими функциями?

Теги:
laravel-5

20 ответов

431
Лучший ответ

Создайте файл helpers.php в папке вашего приложения и загрузите его композитором:

"autoload": {
    "classmap": [
        ...
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/helpers.php" // <---- ADD THIS
    ]
},

После добавления в файл composer.json выполните следующую команду:

composer dump-autoload

Если вам не нравится хранить файл helpers.php в каталоге app (поскольку он не является файлом класса с laravel.com имен PSR-4), вы можете сделать то, что laravel.com сайт laravel.com: сохранить helpers.php в каталоге загрузки. Не забудьте установить его в файле composer.json:

"files": [
    "bootstrap/helpers.php"
]
  • 65
    Совет для новичков: используйте эту команду после изменения composer.json. композитор дамп-автозагрузка
  • 9
    @ AllfaridMoralesGarcía Или, может быть, просто «полезный совет, так как ответ не дает понять, что вам нужно делать это потом».
Показать ещё 21 комментарий
285

Пользовательские классы в Laravel 5, Easy Way

Этот ответ применим к общим пользовательским классам в Laravel. Более подробный ответ на Blade см. В Пользовательских директивах Blade в Laravel 5.

Шаг 1: Создайте файл справки (или другого пользовательского класса) и сопоставьте им пространство имен. Напишите свой класс и метод:

<?php // Code within app\Helpers\Helper.php

namespace App\Helpers;

class Helper
{
    public static function shout(string $string)
    {
        return strtoupper($string);
    }
}

Шаг 2: Создайте псевдоним:

<?php // Code within config/app.php

    'aliases' => [
     ...
        'Helper' => App\Helpers\Helper::class,
     ...

Шаг 3: Используйте его в шаблоне Blade:

<!-- Code within resources/views/template.blade.php -->

{!! Helper::shout('this is how to use autoloading correctly!!') !!}

Дополнительный кредит: Используйте этот класс в любом месте вашего приложения Laravel:

<?php // Code within app/Http/Controllers/SomeController.php

namespace App\Http\Controllers;

use Helper;

class SomeController extends Controller
{

    public function __construct()
    {
        Helper::shout('now i\'m using my helper class in a controller!!');
    }
    ...

Источник: http://www.php-fig.org/psr/psr-4/

Почему это работает: https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php

Если автозагрузка происходит от: http://php.net/manual/en/language.oop5.autoload.php

  • 26
    Чтобы быть ясным, этот ответ на самом деле не касается помощников, которые являются функциями с глобальным пространством имен. Вместо этого он поощряет преобразование помощников в методы класса. Как правило, это лучший подход, но на самом деле он не отвечает на заданный здесь вопрос, поэтому другие ответы настолько сложны для сравнения.
  • 1
    Функция-помощник означает, что она доступна и в Blade. Как сделать эту функцию доступной в Blade? Вы не можете вызвать Helper :: prettyJason (параметры) в блейде.
Показать ещё 14 комментариев
261

моя первоначальная мысль была автозагрузкой композитора, но мне это не очень понравилось Laravel 5ish. L5 сильно использует сервис-провайдеров, это то, что загружает ваше приложение.

Для начала я создал папку в моем каталоге app с именем Helpers. Затем в папке Helpers я добавил файлы для функций, которые я хотел добавить. Наличие папки с несколькими файлами позволяет избежать того, что один большой файл становится слишком длинным и неуправляемым.

Затем я создал HelperServiceProvider.php, выполнив команду artisan:

artisan make:provider HelperServiceProvider

В рамках метода register я добавил этот фрагмент

public function register()
{
    foreach (glob(app_path().'/Helpers/*.php') as $filename){
        require_once($filename);
    }
}

окончательно зарегистрируйте поставщика услуг в вашем config/app.php в массиве поставщиков

'providers' => [
    'App\Providers\HelperServiceProvider',
]

теперь загружается любой файл в каталоге Helpers и готов к использованию.

ОБНОВЛЕНИЕ 2016-02-22

Здесь есть много хороших вариантов, но если мой ответ работает на вас, я пошел вперед и сделал пакет для включения помощников таким образом. Вы можете использовать пакет для вдохновения или не стесняйтесь загружать его вместе с Composer. В нем есть встроенные помощники, которые я часто использую (но все они неактивны по умолчанию) и позволяет создавать собственные пользовательские помощники с простым генератором Artisan. Он также учитывает предположение, что один ответчик имел использование mapper и позволяет вам явно определять пользовательские помощники для загрузки или по умолчанию автоматически загружать все PHP файлы в ваш справочный каталог. Обратная связь и PR очень ценятся!

composer require browner12/helpers

Github: browner12/helpers

  • 29
    для людей, у которых есть только несколько функций, которые они должны добавить, автозагрузка композитора отлично подходит, но для тех из нас, у кого может быть много вспомогательных функций, организация нескольких файлов является обязательной. это решение, по сути, то, что я делал в L4, за исключением того, что я зарегистрировал файлы в своем файле start.php (что было не очень хорошо, но в то время служило цели). у вас есть другое предложение для загрузки нескольких файлов?
  • 7
    Если у вас есть несколько файлов, добавьте их все в ваш файл composer.json. Добавление даже 5-10 строк имеет куда больше смысла, чем то, что есть у вас здесь.
Показать ещё 17 комментариев
72

Это то, что предлагается JeffreyWay в этом обсуждении Laracasts.

  • В вашем каталоге app/Http создайте файл helpers.php и добавьте свои функции.
  • В composer.json в блоке autoload добавьте "files": ["app/Http/helpers.php"].
  • Запустите composer dump-autoload.
  • 13
    Помощники могут быть не только HTTP. app/helpers.php или app/Helpers/ кажется, лучше.
  • 1
    Что, если мы находимся на общем сервере и не можем использовать composer dump-autoload ?
Показать ещё 1 комментарий
48

Просеяв множество ответов на SO и Google, я все еще не мог найти оптимальный подход. В большинстве ответов мы оставляем приложение и полагаемся на сторонний инструмент Composer для выполнения этой работы, но я не уверен, что соединение с инструментом просто для включения файла является мудрым.

ответ Эндрю Брауна оказался ближе всего к тому, как я думаю, к нему нужно подходить, но (по крайней мере, в 5.1) шаг поставщика услуг не нужен. Гейсианский ответ подчеркивает использование PSR-4, который приближает нас на один шаг. Здесь моя окончательная реализация для помощников в представлениях:

Сначала создайте вспомогательный файл в любом месте вашего каталога приложений с пространством имён:

namespace App\Helpers;

class BobFinder
{
    static function bob()
    {
        return '<strong>Bob?! Is that you?!</strong>';
    }
}

Далее, добавьте свой класс в config\app.php в массив aliases:

'aliases' => [
    // Other aliases
    'BobFinder' => App\Helpers\BobFinder::class
]

И это должно быть все, что вам нужно сделать. PSR-4, и псевдоним должен выдать помощника вашим представлениям, поэтому, на ваш взгляд, если вы наберете:

{!! BobFinder::bob() !!}

Он должен выводить:

<strong>Bob?! Is that you?!</strong>
  • 0
    спасибо за публикацию этого. как указал @ Dan-Hunsaker в моем решении, мы до сих пор не получили функцию с глобальным пространством имен, то есть возможность писать просто {!! bob() !!} . собираюсь сделать еще поиск и посмотреть, возможно ли это
  • 1
    Я больше думал об этом, и попытка сделать bob() настоящему глобальным не была бы мудрой вещью. Пространства имен существуют по причине, и мы не должны вызывать bob() вместе с базовыми функциями PHP. Я добавлю ваш бит псевдонима в мой код - спасибо!
Показать ещё 8 комментариев
25

Пользовательские директивы Blade в Laravel 5

Да, есть еще один способ сделать это!

Шаг 1: Зарегистрируйте настраиваемую директиву Blade:

<?php // code in app/Providers/AppServiceProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use Blade; // <-- This is important! Without it you'll get an exception.

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
     public function boot()
     {
         // Make a custom blade directive:
         Blade::directive('shout', function ($string) {
             return trim(strtoupper($string), '(\'\')');
         });

         // And another one for good measure:
         Blade::directive('customLink', function () {
             return '<a href="#">Custom Link</a>';
         });
     }
    ...

Шаг 2: Используйте свою собственную директиву Blade:

<!-- // code in resources/views/view.blade.php -->

@shout('this is my custom blade directive!!')
<br />
@customLink

Выходы:

ЭТО МОЯ ДИРЕКТИВНАЯ НАЛИЧНАЯ ЛОЖЬ!

Пользовательская ссылка


Источник: https://laravel.com/docs/5.1/blade#extending-blade

Дополнительное чтение: https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives


Если вы хотите узнать, как лучше всего создавать пользовательские классы, которые вы можете использовать в любом месте, см. Пользовательские классы в Laravel 5, легкий путь

  • 0
    Это должно быть помечено как лучший ответ, потому что вопрос заключался в том, чтобы «не повторять код между некоторыми представлениями». Ключевое слово ВИДЫ. :)
19

Это мой файл HelpersProvider.php:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider
{
    protected $helpers = [
        // Add your helpers in here
    ];

    /**
     * Bootstrap the application services.
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     */
    public function register()
    {
        foreach ($this->helpers as $helper) {
            $helper_path = app_path().'/Helpers/'.$helper.'.php';

            if (\File::isFile($helper_path)) {
                require_once $helper_path;
            }
        }
    }
}

Вы должны создать папку под именем Helpers в папке app, затем создать файл с именем whatever.php внутри и добавить строку whatever внутри массива $helpers.

Готово!

Изменить

Я больше не использую этот параметр, я в настоящее время использую композитор для загрузки статических файлов, таких как помощники.

Вы можете добавить помощников непосредственно по адресу:

...
"autoload": {
    "files": [
        "app/helpers/my_helper.php",
        ...
    ]
},
...
  • 0
    Существуют ли другие причины, кроме производительности, для создания картографа вместо загрузки всех файлов в каталоге с помощью glob() как писал Эндрю Браун? Если вы хотите иметь возможность указывать файлы, которые хотите включить, почему бы не указать файлы в composer.json для их автозагрузки, как писал Джозеф Силбер? Почему вы предпочитаете это решение? Я не говорю, что это плохое решение, мне просто любопытно.
  • 3
    При отображенном подходе проще выборочно включать / отключать помощников, если, например, один из вспомогательных файлов содержит ошибку прерывания. При этом отображение файлов в поставщике услуг мало чем отличается от этого в composer.json за исключением двух моментов: во-первых, карта хранится в самом приложении, а не в файле метаданных; во-вторых, он не требует повторного запуска composer dump-autoload каждый раз, когда вы меняете список файлов для загрузки.
Показать ещё 3 комментария
9

Для пользовательских вспомогательных библиотек в моем проекте Laravel я создал папку с именем Libraries в моей директории Laravel/App и в каталоге Libraries, я создал различные файлы для разных вспомогательных библиотек.

После создания моих вспомогательных файлов я просто включаю все эти файлы в свой файл composer.json, как этот

...
"autoload": {
        "classmap": [
            "database"
        ],
        "files": [
            "app/Libraries/commonFunctions.php"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
...

и выполните

composer dumpautoload
  • 0
    composer dump-autoload composer dumpautoload и composer dumpautoload также работает infact composer du также будет работать ...
7

вместо того, чтобы включать ваш собственный вспомогательный класс, вы можете фактически добавить в свой config/app.php файл под псевдонимами.

должен выглядеть так.

 'aliases' => [ 
    ...
    ...
    'Helper' => App\Http\Services\Helper::class,
 ]

а затем к вашему контроллеру, включите Помощник, используя метод 'use Helper', чтобы вы могли просто вызвать некоторый метод в вашем классе Helper.

eg. Helper::some_function();

или в представлении ресурсов вы можете напрямую вызвать класс Helper.

eg. {{Helper::foo()}}

Но это все-таки стиль стиля кодирования разработчика, которым нужно следовать. У нас может быть другой способ решения проблем, и я просто хочу поделиться тем, что у меня тоже для новичков.

7

Поскольку ОП попросил передовой опыт, я думаю, что мы по-прежнему не замечаем здесь хороших советов.

Один файл helpers.php далек от хорошей практики. Во-первых, потому что вы смешиваете множество различных функций, поэтому вы против хороших принципов кодирования. Более того, это может повредить не только документацию по коду, но и кодовые метрики, такие как Cyclomatic Complexity, Index of Tables и Halstead Volume. Чем больше функций у вас, тем больше становится хуже.

Документация кода была бы хорошо с использованием таких инструментов, как phpDocumentor, но с использованием Sami он не будет обрабатывать процедурные файлы. Документация API Laravel - такой случай - нет документации вспомогательных функций: https://laravel.com/api/5.4

Метрики кода можно анализировать с помощью таких инструментов, как PhpMetrics. Использование PhpMetrics версии 1.x для анализа кода структуры Laravel 5.4 даст вам очень плохие показатели CC/MI/HV для файлов src/Illuminate/Foundation/helpers.php и src/Illuminate/Support/helpers.php.

Несколько контекстных вспомогательных файлов (например, string_helpers.php, array_helpers.php и т.д.), Безусловно, улучшат эти плохие показатели, что приведет к упрощению кода. В зависимости от используемого генератора кода кода это было бы достаточно.

Его можно дополнительно улучшить, используя вспомогательные классы со статическими методами, чтобы они могли быть контекстуализированы с использованием пространств имен. Точно так же, как Laravel уже делает с Illuminate\Support\Str и Illuminate\Support\Arr классы. Это улучшает как показатели кода, так и организацию и документацию. Классовые псевдонимы могут использоваться для упрощения их использования.

Структурирование с помощью классов улучшает организацию кода и документацию, но, с другой стороны, мы теряем те прекрасные короткие и легко запоминающиеся глобальные функции. Мы также можем улучшить этот подход, создав псевдонимы функций для этих методов статических классов. Это можно сделать вручную или динамически.

Первый подход Laravel использует, объявляя функции в процедурных вспомогательных файлах, которые сопоставляются с методами статических классов. Возможно, это не идеальная вещь, так как вам нужно обновить все материалы (docblocks/arguments).
Я лично использую динамический подход с классом HelperServiceProvider который создает эти функции во время выполнения:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider
{
    /**
     * The helper mappings for the application.
     *
     * @var array
     */
    protected $helpers = [
        'uppercase' => 'App\Support\Helpers\StringHelper::uppercase',
        'lowercase' => 'App\Support\Helpers\StringHelper::lowercase',
    ];

    /**
     * Bootstrap the application helpers.
     *
     * @return void
     */
    public function boot()
    {
        foreach ($this->helpers as $alias => $method) {
            if (!function_exists($alias)) {
                eval("function {$alias}(...\$args) { return {$method}(...\$args); }");
            }
        }
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Можно сказать, что это связано с инженерной разработкой, но я так не думаю. Он работает очень хорошо и вопреки тому, что можно ожидать, это не стоит соответствующего времени выполнения, по крайней мере, при использовании PHP 7.x.

5

Здесь bash shell script, который я создал, чтобы сделать фасады Laravel 5 очень быстрыми.

Запустите это в своем установочном каталоге Laravel 5.

Вызовите его следующим образом:

make_facade.sh -f <facade_name> -n '<namespace_prefix>'

Пример:

make_facade.sh -f helper -n 'App\MyApp'

Если вы запустите этот пример, он создаст каталоги Facades и Providers в разделе "your_laravel_installation_dir/app/MyApp".

Он создаст следующие 3 файла и выведет их на экран:

./app/MyApp/Facades/Helper.php
./app/MyApp/Facades/HelperFacade.php
./app/MyApp/Providers/HelperServiceProvider.php

После этого появится сообщение, похожее на следующее:

===========================
    Finished
===========================

Add these lines to config/app.php:
----------------------------------
Providers: App\MyApp\Providers\HelperServiceProvider,
Alias: 'Helper' => 'App\MyApp\Facades\HelperFacade',

Итак, обновите список поставщиков и псевдонимов в папке "config/app.php"

Выполнить composer -o dumpautoload

"./app/MyApp/Facades/Helper.php" будет выглядеть следующим образом:

<?php

namespace App\MyApp\Facades;


class Helper
{
    //
}

Теперь просто добавьте свои методы в "./app/MyApp/Facades/Helper.php" .

Вот что выглядит "./app/MyApp/Facades/Helper.php" после добавления функции Helper.

<?php

namespace App\MyApp\Facades;

use Request;

class Helper
{
    public function isActive($pattern = null, $include_class = false)
    {
        return ((Request::is($pattern)) ? (($include_class) ? 'class="active"' : 'active' ) : '');
    }
}

This is how it would be called:
===============================

{!!  Helper::isActive('help', true) !!}

Эта функция ожидает шаблон и может принимать необязательный второй логический аргумент.

Если текущий URL-адрес соответствует шаблону, переданному ему, он выведет "active" (или "class=" active ", если вы добавите" true "в качестве второго аргумента вызова функции).

Я использую его, чтобы выделить активное меню.

Ниже приведен исходный код для моего script. Надеюсь, вы сочтете это полезным и, пожалуйста, дайте мне знать, если у вас есть проблемы с ним.

#!/bin/bash

display_syntax(){
    echo ""
    echo "  The Syntax is like this:"
    echo "  ========================"
    echo "      "$(basename $0)" -f <facade_name> -n '<namespace_prefix>'"
    echo ""
    echo "  Example:"
    echo "  ========"
    echo "      "$(basename $0) -f test -n "'App\MyAppDirectory'"
    echo ""
}


if [ $# -ne 4 ]
then
    echo ""
    display_syntax
    exit
else
# Use > 0 to consume one or more arguments per pass in the loop (e.g.
# some arguments don't have a corresponding value to go with it such
# as in the --default example).
    while [[ $# > 0 ]]
    do
        key="$1"
            case $key in
            -n|--namespace_prefix)
            namespace_prefix_in="$2"
            echo ""
            shift # past argument
            ;;
            -f|--facade)
            facade_name_in="$2"
            shift # past argument
            ;;
            *)
                    # unknown option
            ;;
        esac
        shift # past argument or value
    done
fi
echo Facade Name = ${facade_name_in}
echo Namespace Prefix = $(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
echo ""
}


function display_start_banner(){

    echo '**********************************************************'
    echo '*          STARTING LARAVEL MAKE FACADE SCRIPT'
    echo '**********************************************************'
}

#  Init the Vars that I can in the beginning
function init_and_export_vars(){
    echo
    echo "INIT and EXPORT VARS"
    echo "===================="
    #   Substitution Tokens:
    #
    #   Tokens:
    #   {namespace_prefix}
    #   {namespace_prefix_lowerfirstchar}
    #   {facade_name_upcase}
    #   {facade_name_lowercase}
    #


    namespace_prefix=$(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
    namespace_prefix_lowerfirstchar=$(echo ${namespace_prefix_in} | sed -e 's#\\#/#g' -e 's/^\(.\)/\l\1/g')
    facade_name_upcase=$(echo ${facade_name_in} | sed -e 's/\b\(.\)/\u\1/')
    facade_name_lowercase=$(echo ${facade_name_in} | awk '{print tolower($0)}')


#   Filename: {facade_name_upcase}.php  -  SOURCE TEMPLATE
source_template='<?php

namespace {namespace_prefix}\Facades;

class {facade_name_upcase}
{
    //
}
'


#  Filename: {facade_name_upcase}ServiceProvider.php    -   SERVICE PROVIDER TEMPLATE
serviceProvider_template='<?php

namespace {namespace_prefix}\Providers;

use Illuminate\Support\ServiceProvider;
use App;


class {facade_name_upcase}ServiceProvider extends ServiceProvider {

    public function boot()
    {
        //
    }

    public function register()
    {
        App::bind("{facade_name_lowercase}", function()
        {
            return new \{namespace_prefix}\Facades\{facade_name_upcase};
        });
    }

}
'

#  {facade_name_upcase}Facade.php   -   FACADE TEMPLATE
facade_template='<?php

namespace {namespace_prefix}\Facades;

use Illuminate\Support\Facades\Facade;

class {facade_name_upcase}Facade extends Facade {

    protected static function getFacadeAccessor() { return "{facade_name_lowercase}"; }
}
'
}


function checkDirectoryExists(){
    if [ ! -d ${namespace_prefix_lowerfirstchar} ]
    then
        echo ""
        echo "Can't find the namespace: "${namespace_prefix_in}
        echo ""
        echo "*** NOTE:"
        echo "           Make sure the namspace directory exists and"
        echo "           you use quotes around the namespace_prefix."
        echo ""
        display_syntax
        exit
    fi
}

function makeDirectories(){
    echo "Make Directories"
    echo "================"
    mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
    mkdir -p ${namespace_prefix_lowerfirstchar}/Providers
    mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
}

function createSourceTemplate(){
    source_template=$(echo "${source_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
    echo "Create Source Template:"
    echo "======================="
    echo "${source_template}"
    echo ""
    echo "${source_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}.php
}

function createServiceProviderTemplate(){
    serviceProvider_template=$(echo "${serviceProvider_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
    echo "Create ServiceProvider Template:"
    echo "================================"
    echo "${serviceProvider_template}"
    echo ""
    echo "${serviceProvider_template}" > ./${namespace_prefix_lowerfirstchar}/Providers/${facade_name_upcase}ServiceProvider.php
}

function createFacadeTemplate(){
    facade_template=$(echo "${facade_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
    echo "Create Facade Template:"
    echo "======================="
    echo "${facade_template}"
    echo ""
    echo "${facade_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}Facade.php
}


function serviceProviderPrompt(){
    echo "Providers: ${namespace_prefix_in}\Providers\\${facade_name_upcase}ServiceProvider,"
}

function aliasPrompt(){
    echo "Alias: '"${facade_name_upcase}"' => '"${namespace_prefix_in}"\Facades\\${facade_name_upcase}Facade'," 
}

#
#   END FUNCTION DECLARATIONS
#


###########################
## START RUNNING SCRIPT  ##
###########################

display_start_banner

init_and_export_vars
makeDirectories 
checkDirectoryExists
echo ""

createSourceTemplate
createServiceProviderTemplate
createFacadeTemplate
echo ""
echo "==========================="
echo "  Finished TEST"
echo "==========================="
echo ""
echo "Add these lines to config/app.php:"
echo "----------------------------------"
serviceProviderPrompt
aliasPrompt
echo ""
3

Создать каталог настраиваемых помощников: Сначала создайте каталог помощников в каталоге приложения. Создать определение класса hlper: Давайте теперь создадим простую вспомогательную функцию, которая объединит две строки. Создайте новый файл MyFuncs.php в /app/Helpers/MyFuncs.php Добавьте следующий код

<?php

namespace App\Helpers;

class MyFuncs {

    public static function full_name($first_name,$last_name) {
        return $first_name . ', '. $last_name;   
    }
}

namespace App\Helpers; определяет пространство имен Helpers в пространстве имен приложений. class MyFuncs {...} определяет вспомогательный класс MyFuncs. public static function full_name ($ first_name, $last_name) {...} определяет статическую функцию, которая принимает два строковых параметра и возвращает конкатенированную строку

Служба помощников предоставляет класс

Поставщики услуг используются для классов автоматической загрузки. Нам нужно будет определить поставщика услуг, который будет загружать все наши вспомогательные классы в каталог /app/Helpers.

Запустите следующую команду мастера:

php artisan make: поставщик HelperServiceProvider

Файл будет создан в /app/Providers/HelperServiceProvider.php

Open /app/Providers/HelperServiceProvider.php

Добавьте следующий код:

<?php 

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider {

   /**
    * Bootstrap the application services.
    *
    * @return void
    */
   public function boot()
   {
      //
   }

   /**
    * Register the application services.
    *
    * @return void
    */
   public function register()
   {
        foreach (glob(app_path().'/Helpers/*.php') as $filename){
            require_once($filename);
        }
   }
}

ЗДЕСЬ

namespace App\Providers; defines the namespace provider
use Illuminate\Support\ServiceProvider; imports the ServiceProvider class namespace
class HelperServiceProvider extends ServiceProvider {…} defines a class HelperServiceProvider that extends the ServiceProvider class
public function boot(){…} bootstraps the application service
public function register(){…} is the function that loads the helpers
foreach (glob(app_path().'/Helpers/*.php') as $filename){…} loops through all the files in /app/Helpers directory and loads them.

Теперь нам нужно зарегистрировать HelperServiceProvider и создать псевдоним для наших помощников.

Откройте /config/app.php файл

Найдите переменную массива поставщиков

Добавьте следующую строку

App\Providers\HelperServiceProvider::class,

Найдите переменную массива псевдонимов

Добавьте следующую строку

'MyFuncs' => App\Helpers\MyFuncs::class,

Сохранить изменения Использование нашего специального помощника

Мы создадим маршрут, который вызовет нашу пользовательскую вспомогательную функцию. Откройте /app/routes.php

Добавьте следующее определение маршрута

Route::get('/func', function () {
    return MyFuncs::full_name("John","Doe");
});

ЗДЕСЬ

return MyFuncs::full_name("John","Doe"); calls the static function full_name in MyFuncs class
3

Лучшей практикой для написания пользовательских помощников является

1) Внутри каталога app корня проекта создайте папку с именем Helpers (просто для разделения и структурирования кода).

2) Внутри папки пишут файлы psr-4 или обычные php файлы

Если файлы PHP находятся в формате psr-4, он будет автоматически загружен, иначе добавьте следующую строку в компоновщик .json, которая находится внутри корневого каталога проекта

Внутри клавиши autoload создайте новый ключ с именем files для загрузки файлов во время автоматической загрузки, внутри объекта files добавьте путь, начиная с каталога приложений. Вот пример.

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/Helpers/customHelpers.php"
    ]
},
"autoload-dev": {
    "classmap": [
        "tests/TestCase.php"
    ]
},

PS: попробуйте запустить composer dump-autoload, если файл не загружен.

3

Другой способ, которым я пользовался, был: 1) создал файл в app\FolderName\fileName.php и имел этот код внутри него i.e

<?php
namespace App\library
{
 class hrapplication{
  public static function libData(){
   return "Data";
  }
 }
}
?>

2) После этого в нашем лезвии

 $FmyFunctions = new \App\FolderName\classsName;
  echo $is_ok = ($FmyFunctions->libData());

что он. и он работает

2

Создать Helpers.php в приложении /Helper/Helpers.php

namespace App\Helper
class Helpers
{


}

Добавить в композитор и композитор

 "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories",
            "database","app/Helper/Helpers.php"
        ],
        "psr-4": {
            "App\\": "app/"
        },
         "files": ["app/Helper/Helpers.php"]
    },

использование в контроллере

use App\Helper\Helpers

использовать в поле зрения изменения в файле config-> app.php

   'aliases' => [
    ...
    'Helpers'   => 'App\Helper\Helpers'
    ],

вызвать в поле зрения

<?php echo Helpers::function_name();  ?>
  • 0
    Спасибо, не могли бы вы немного расширить объяснение?
  • 1
    Если класс находится в пространстве имен, добавление файла в composer.json бесполезно, поскольку автозагрузка psr-4 сделает эту работу.
2

в каталоге dir bootstrap\autoload.php

require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../app/Helpers/function.php'; //add

добавить этот файл

app\Helpers\function.php
1

Сначала создайте helpers.php внутри каталога App\Http. Затем добавьте следующий код внутри composer.json

"autoload": {
        "classmap": [
            "database"
        ],
        "files": [
            "app/Http/helpers.php"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },

Затем выполните следующую команду

composer dump-autoload

Теперь вы можете определить свою пользовательскую функцию внутри файла helpers.php.

0

**

  • Помощник по статусу

** создать нового помощника

<?php

namespace App\Helpers;

use Illuminate\Database\Eloquent\Collection;

class StatusHelper
{
 protected static $_status = [
        1=> [
            'value' => 1,
            'displayName' => 'Active',
        ],
        2 => [
            'value' => 2,
            'displayName' => 'Inactive',
        ],
        3 => [
            'value' => 3,
            'displayName' => 'Delete',
        ],

    ];

     public static function getStatusesList()
    {
        $status = (new Collection(self::$_status))->pluck('displayName', 'value')->toArray();


        return $status;
    }
}

Использование для контроллера и любого файла вида

use App\Helpers\StatusHelper;

class ExampleController extends Controller
{
        public function index()
        {
            $statusList = StatusHelper::getStatusesList();

            return view('example.index', compact('statusList'));
        }
}
0

Здесь есть отличные ответы, но я думаю, что это самый простой. В Laravel 5.4 (и более ранних версиях) вы можете создать класс, удобный для вас, например App/Libraries/Helper.php

class Helper() {
    public function uppercasePara($str) {
        return '<p>' .strtoupper($str). '<p>;
    }
}

Затем вы можете просто называть его в шаблоне Blade следующим образом:

@inject('helper', \App\Libraries\Helper)
{{ $helper->drawTimeSelector() }}

Если вы не хотите использовать @inject, просто сделайте функцию "uppercasePara" статичной и вставьте вызов в свой шаблон Blade следующим образом:

{{ \App\Libraries\Helper::drawTimeSelector() }}

Нет необходимости в псевдонимах. Laravel автоматически разрешает конкретный класс.

0

В laravel 5.3 и выше команда laravel переместила все процедурные файлы (routes.php) из каталога app/, а вся папка app/ была загружена psr-4. Принятый ответ будет работать в этом случае, но мне это не кажется правильным.

Итак, что я сделал, я создал каталог helpers/ в корне моего проекта и поместил в него вспомогательные файлы, а в моем composer.json файле я сделал это:

...
"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "helpers/ui_helpers.php"
    ]
},
...

Таким образом, мой каталог app/ по-прежнему является автозагрузкой psr-4, а помощники немного лучше организованы.

Надеюсь, это поможет кому-то.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню