Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Создайте новый файл в каталоге вашего приложения/справочника it it 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',

Ответ 2

Простой и эффективный способ создания файла глобальных функций - это его автозагрузка прямо из 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.

Ответ 3

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

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

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

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

Файл: 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

Давай тест с тинкером

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

С лезвием

<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

Ответ 4

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

utils.php

if (!function_exists('printHello')) {

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

в app/Providers/AppServiceProvider.php добавьте следующее в зарегистрируйте метод

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

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