Я хотел бы создать некоторые помощники (функции), чтобы избежать повторения кода между некоторыми видами в стиле L5:
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
Это в основном функции форматирования текста. Где и как я могу поместить файл с этими функциями?
Создайте файл helpers.php
в папке вашего приложения и загрузите его композитором:
"autoload": { "classmap": [ ... ], "psr-4": { "App\\": "app/" }, "files": [ "app/helpers.php" // <---- ADD THIS ] },
После добавления в файл composer.json
выполните следующую команду:
composer dump-autoload
моя первоначальная мысль тоже была автозагрузкой композитора, но мне это не очень понравилось 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', ]
теперь загружается любой файл в вашем справочном каталоге и готов к использованию.
ОБНОВЛЕНИЕ 2016-02-22
Здесь есть много хороших вариантов, но если мой ответ работает на вас, я пошел вперед и сделал пакет для включения помощников таким образом. Вы можете использовать пакет для вдохновения или не стесняйтесь загружать его вместе с Composer. В нем есть встроенные помощники, которые я часто использую (но все они неактивны по умолчанию) и позволяет создавать собственные пользовательские помощники с простым генератором Artisan. Он также учитывает предположение, что один ответчик имел использование mapper и позволяет вам явно определять пользовательские помощники для загрузки или по умолчанию автоматически загружать все PHP-файлы в ваш справочный каталог. Обратная связь и PR очень ценятся!
composer require browner12/helpers
Github: browner12 / helpers
Этот ответ применим к общим пользовательским классам в Laravel. Более подробный ответ на 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
Это то, что предлагает JeffreyWay
в этой дискуссии Laracasts .
app/Http
создайте файл helpers.php
и добавьте свои функции. composer.json
в блоке autoload
добавьте "files": ["app/Http/helpers.php"]
. composer dump-autoload
. Просеяв множество ответов на 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>
Да, есть еще один способ сделать это!
Шаг 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», «Легкий способ»
Это мой файл 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
внутри и добавить строку в массив $ helpers.
Готово!
Я больше не использую этот параметр, я в настоящее время использую композитор для загрузки статических файлов, таких как помощники.
Вы можете добавить помощников непосредственно:
... "autoload": { "files": [ "app/helpers/my_helper.php", ... ] }, ...
Для пользовательских вспомогательных библиотек в моем проекте Laravel я создал папку с именем Libraries
в моем каталоге Laravel/App
Directory и в каталоге Libraries, я создал различные файлы для разных вспомогательных библиотек.
После создания моих вспомогательных файлов я просто включаю все эти файлы в свой файл composer.json, как это
... "autoload": { "classmap": [ "database" ], "files": [ "app/Libraries/commonFunctions.php" ], "psr-4": { "App\\": "app/" } }, ...
и выполнить
composer dumpautoload
Поскольку ОП попросил передовой опыт , я думаю, что мы по-прежнему не замечаем здесь хороших советов.
Один файл 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.
Вот сценарий оболочки bash, который я создал, чтобы сделать фасады 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».
./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 »в качестве второго аргумента в вызов функции).
Я использую его, чтобы выделить активное меню.
#!/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 (eg # 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 ""
Другой способ, которым я пользовался, был: 1) создал файл в app \ FolderName \ fileName.php и имел этот код внутри него, т.е.
<?php namespace App\library { class hrapplication{ public static function libData(){ return "Data"; } } } ?>
2) После этого в нашем клинке
$FmyFunctions = new \App\FolderName\classsName; echo $is_ok = ($FmyFunctions->libData());
это оно. и он работает
Лучшей практикой для написания специальных помощников является
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
если файл не загружен.
Создайте каталог специальных помощников: сначала создайте каталог помощников в каталоге приложения. Создайте определение класса 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; } }
пространство имен 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
in dir bootstrap \ autoload.php
require __DIR__.'/../vendor/autoload.php'; require __DIR__.'/../app/Helpers/function.php'; //add
добавить этот файл
app\Helpers\function.php
вместо того, чтобы включать ваш собственный вспомогательный класс, вы можете фактически добавить в свой файл config/app.php
под псевдонимами.
должен выглядеть так.
'aliases' => [ ... ... 'Helper' => App\Http\Services\Helper::class, ]
а затем к вашему контроллеру, включите Помощник, используя метод «Использовать Помощник», чтобы вы могли просто вызвать некоторый метод в своем классе Helper.
eg. Helper::some_function();
или в представлении ресурсов вы можете напрямую вызвать класс Helper.
eg. {{Helper::foo()}}
Но это все-таки стиль стиля программирования для разработчиков, которым нужно следовать. У нас может быть другой способ решения проблем, и я просто хочу поделиться тем, что у меня есть для новичков.
В 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, а помощники немного лучше организованы.
Надеюсь, это поможет кому-то.
Здесь есть отличные ответы, но я думаю, что это самое простое. В 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 автоматически разрешает конкретный класс.
Сначала создайте helpers.php внутри каталога App \ Http. Затем добавьте следующий код внутри composer.json
"autoload": { "classmap": [ "database" ], "files": [ "app/Http/helpers.php" ], "psr-4": { "App\\": "app/" } },
Затем выполните следующую команду
composer dump-autoload
Now you can define your custom function inside the helpers.php file. Here you can get the full guide
Create Helpers.php in app/Helper/Helpers.php namespace App\Helper class Helpers {
}
Add in composer and composer update
"autoload": { "classmap": [ "database/seeds", "database/factories", "database","app/Helper/Helpers.php" ], "psr-4": { "App\\": "app/" }, "files": ["app/Helper/Helpers.php"] },
use in Controller
use App\Helper\Helpers