Как мне сделать глобальные вспомогательные функции в laravel 5?

Если бы я хотел сделать currentUser() функцию для некоторых вещей oauth, я делаю там, где я могу использовать ее в представлении или в контроллере (подумайте о рельсах, где вы делаете helper_method: current_user в контроллере приложения).

Все, что я читаю, говорит о том, что нужно создать папку помощников и тут же добавить функцию, и тогда вы сможете это сделать Helpers::functionName Это правильный способ сделать это?

Что такое «способ laravel» для создания вспомогательных функций, которые можно использовать в шаблонах и контроллерах лезвий?


person TheWebs    schedule 06.09.2015    source источник
comment
Возможно, это поможет: stackoverflow.com/questions/28290332/   -  person Iamzozo    schedule 06.09.2015


Ответы (5)


Создайте новый файл в каталоге app / Helpers, назовите его AnythingHelper.php Пример моего помощника:

<?php
function getDomesticCities()
{
$result = \App\Package::where('type', '=', 'domestic')
    ->groupBy('from_city')
    ->get(['from_city']);

return $result;
}

сгенерируйте поставщика услуг для вашего помощника, выполнив следующую команду

php artisan make:provider HelperServiceProvider

в функции регистрации вашего вновь созданного HelperServiceProvider.php добавьте следующий код

require_once app_path('Helpers/AnythingHelper.php');

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

'App\Providers\HelperServiceProvider',
person Khan Shahrukh    schedule 06.09.2015
comment
Как использовать это в лезвии. Вам нужно зарегистрировать фасад? - person MaXi32; 21.01.2016
comment
Нет, только вышеупомянутый код делает это, в вашем файле лезвия сделайте {{yourHelperFunction ('param')}} - person Khan Shahrukh; 21.01.2016
comment
Я бы хотел вызвать вспомогательную функцию с помощью Helper :: myHelperFunction ('param') в blade. Смотрится получше. Вы знаете, как это зарегистрировать? - person MaXi32; 21.01.2016
comment
Я не думаю, что вы получаете доступ к фасадам в клинке, и если вы можете (путем настройки чего-то), я не уверен, что это хорошая практика - person Khan Shahrukh; 21.01.2016
comment
Я добавил псевдоним / фасад в config / app, например: 'Helper' = ›App \ Helpers \ Helper :: class, и я могу использовать Helper :: myHelperFunction ('param') в лезвии. - person MaXi32; 21.01.2016
comment
Спасибо. Не уверен, что это плохая практика. Я видел, как многие люди его использовали. Это просто выглядит лучше, чем наличие глобальной функции, которая конфликтовала бы со встроенной функцией PHP. Как функция time (). Итак, это лучшее из того, что мы используем MyHelper :: time () в blade; - person MaXi32; 21.01.2016
comment
lol @ выглядит лучше. Фасады НЕ лучше - и в большинстве случаев их использование - плохая практика. - person Mike Barwick; 14.04.2016
comment
require base_path().'/app/Helpers/AnythingHelper.php'; у меня не работает с ошибкой Требуется неудачное открытие - person 4ndro1d; 06.10.2016
comment
AnythingHelper.php - это просто пример, вы должны заменить его исходным именем файла - person Khan Shahrukh; 06.10.2016
comment
@KhanShahrukh используйте require_once base_path().'/app/Helpers/AnythingHelper.php'; Если вы используете require, phpunit завершится ошибкой. - person Armesh Singh; 21.10.2016
comment
Вы должны указать путь в качестве аргумента для base_path (). Вместо этого: base_path (). '/my/helper.php'; Лучше использовать: base_path ('/ my / helper.php'). Также app_path () будет более подходящим;) - person jakub_jo; 19.02.2017
comment
В Lumen мы должны включить в эту моду require_once base_path('app').'/Helpers/AnythingHelper.php'; - person Mahesh.D; 30.04.2019
comment
Не забудьте определить public static function, иначе вы получите ошибку, примерно такую ​​Non-static method App\Helpers\GlobalHelper::getValueFromGlobalHelper() should not be called statically - person Vipertecpro; 26.07.2021

Простой и эффективный способ создания файла глобальных функций - его автозагрузка непосредственно из Composer. Раздел автозагрузки composer принимает автоматически загружаемый массив files.

  1. Создайте functions.php файл где угодно. В этом примере мы собираемся создать внутри app/Helpers.

  2. Добавьте свои функции, но не добавляйте класс или пространство имен.

    <?php
    
    function global_function_example($str)
    {
       return 'A Global Function with '. $str;
    }
    
  3. В composer.json внутри раздела autoload добавьте следующую строку:

    "files": ["app/Helpers/functions.php"]
    

    Пример для Laravel 5:

    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/"
        },
        "files": ["app/Helpers/functions.php"] // <-- Add this line
    },
    
  4. Запустите composer dump-autoload

Выполнено! Теперь вы можете получить доступ global_function_example('hello world') из любой части вашего приложения, включая представления Blade.

person Arian Acosta    schedule 06.04.2017
comment
Мне также нужно создать глобальную функцию, которую можно вызывать в нескольких файлах контроллера. Это выглядит просто, но что происходит при запуске команды composer dump-autoload? Созданы ли новые файлы? Я даже удалил такие файлы, как composer.json, gulpfile.js, поскольку не думал, что они вообще используются. - person Johnny; 17.05.2017
comment
Большой! Запуск composer dump-autoload будет аналогичен очистке кеша композитора. По сути, он повторно оценивает классы, которые необходимо загрузить из файла composer.json. Удачи! - person Arian Acosta; 31.05.2017
comment
Эффективный метод - person Naveen DA; 17.02.2018
comment
намного проще, чем принятый ответ. Я пробовал оба! - person phil; 28.03.2018
comment
Очень нравится эта реализация. Вперед и быстрее! - person realnsleo; 21.03.2019
comment
Если элемент не последний, не забудьте запятую после файлов: [app / Helpers / functions.php], а для Mac команда будет composer.phar dump-autoload - person DragonFire; 04.12.2019

Глобальные помощники Laravel

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

Создайте вспомогательный файл, а не класс

Я предпочитаю вам файл, а не класс, поскольку я не хочу возиться с пространствами имен и хочу, чтобы его функции были доступны без префиксов классов, таких как: greeting('Brian'); вместо Helper::greeting('Brian');, как это делает Laravel со своими помощниками.

Файл: app/Support/helper.php

Зарегистрируйте вспомогательный файл в Composer: composer.json

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

Создайте свою первую вспомогательную функцию

<?php

if (!function_exists('greet')) {
    /**
     * Greeting a person
     *
     * @param  string $person Name
     * @return string
     */
    function greet($person)
    {
        return 'Hello ' . $person;
    }
}

Использование:

Не забудьте автозагрузить файл, прежде чем пытаться получить доступ к его функциям: composer dump-autoload

Давайте протестируем с Tinker

$ php artisan tinker
Psy Shell v0.8.17 (PHP 7.0.6 ΓÇö cli) by Justin Hileman
>>> greet('Brian');
=> "Hello Brian"
>>> exit
Exit:  Goodbye.

С Blade

<p>{{ greet('Brian') }}</p>

Расширенное использование в качестве директивы Blade:

Иногда вы захотите использовать директиву blade вместо простой функции. Зарегистрируйте директиву Blade в методе загрузки AppServiceProvider: app/Providers/AppServiceProvider.php

public function boot()
{
    // ...
    Blade::directive('greet', function ($expression) {
        return "<?php echo greet({$expression}); ?>";
    });
}

Использование: <p>@greet('Brian')</p>

Примечание. вам может потребоваться очистить просмотры кеша php artisan view:clear

person bmatovu    schedule 29.03.2018
comment
Мне пришлось сделать дамп-автозагрузку композитора, чтобы он заработал - person Gjaa; 05.06.2020

Приведенные выше ответы хороши с небольшим усложнением, поэтому такой ответ существует.

utils.php

if (!function_exists('printHello')) {

    function printHello()
    {
        return "Hello world!";
    }
}

в app / Providers / AppServiceProvider.php добавьте следующее в методе register

public function register()
{
   require_once __DIR__ . "/path/to/utils.php"
}

Теперь функция printHello доступна в любом месте кода, как и любые другие глобальные функции laravel.

person f_i    schedule 27.08.2019

Другой вариант, если вы не хотите регистрировать все свои вспомогательные функции одну за другой и вам интересно, как регистрировать их каждый раз, когда вы создаете новую вспомогательную функцию:

Снова в app / Providers / AppServiceProvider.php добавьте следующее в методе register

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