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

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

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

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

27

Решение

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

Другие решения

Еще один эффективный способ создания файла глобальных функций — это его автозагрузка прямо из композитора. Раздел автозагрузки 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"]
},
  1. Бежать composer dump-autoload

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

Надеюсь это кому-нибудь пригодится!

31

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

9
По вопросам рекламы [email protected]