Лучшие практики для индивидуальных помощников в Laravel 5
Я хотел бы создать вспомогательные функции, чтобы избежать повторения кода между представлениями в Laravel 5:
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
Это в основном функции форматирования текста. Где и как я могу создать файл с этими функциями?
Ответы
Ответ 1
Создайте файл 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"
]
Ответ 2
Пользовательские классы в Laravel 5, легкий путь
Этот ответ применим к общим пользовательским классам в 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: Запустите composer dump-autoload
в корне проекта
Шаг 4: Используйте его в своем шаблоне 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
Ответ 3
моя первоначальная мысль была автозагрузкой композитора, но мне это не очень понравилось 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
Ответ 4
Это то, что предлагается JeffreyWay
в этом обсуждении Laracasts.
- В вашем каталоге
app/Http
создайте файл helpers.php
и добавьте свои функции.
- В
composer.json
в блоке autoload
добавьте "files": ["app/Http/helpers.php"]
.
- Запустите
composer dump-autoload
.
Ответ 5
Просеяв множество ответов на 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>
Ответ 6
Пользовательские директивы 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, легкий путь
Ответ 7
Это мой файл 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",
...
]
},
...
Ответ 8
Для пользовательских библиотек помощников в моем проекте Laravel я создал папку с именем Libraries
в моем каталоге Laravel/App
и в каталоге библиотек, я создал различные файлы для разных библиотек помощников.
После создания моих вспомогательных файлов я просто включаю все эти файлы в мой файл composer.json следующим образом
...
"autoload": {
"classmap": [
"database"
],
"files": [
"app/Libraries/commonFunctions.php"
],
"psr-4": {
"App\\": "app/"
}
},
...
и выполнить
composer dump-autoload
Ответ 9
вместо того, чтобы включать ваш собственный вспомогательный класс, вы можете фактически добавить в свой config/app.php
файл под псевдонимами.
должен выглядеть так.
'aliases' => [
...
...
'Helper' => App\Http\Services\Helper::class,
]
а затем к вашему контроллеру, включите Помощник, используя метод 'use Helper', чтобы вы могли просто вызвать некоторый метод в вашем классе Helper.
eg. Helper::some_function();
или в представлении ресурсов вы можете напрямую вызвать класс Helper.
eg. {{Helper::foo()}}
Но это все-таки стиль стиля кодирования разработчика, которым нужно следовать. У нас может быть другой способ решения проблем, и я просто хочу поделиться тем, что у меня тоже для новичков.
Ответ 10
Поскольку ОП попросил передовой опыт, я думаю, что мы по-прежнему не замечаем здесь хороших советов.
Один файл 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.
Ответ 11
Здесь 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 ""
Ответ 12
Создать каталог настраиваемых помощников:
Сначала создайте каталог помощников в каталоге приложения.
Создать определение класса 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
Ответ 13
Другой способ, которым я пользовался, был:
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());
что он. и он работает
Ответ 14
Лучшей практикой для написания пользовательских помощников является
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
, если файл не загружен.
Ответ 15
в каталоге dir bootstrap\autoload.php
require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../app/Helpers/function.php'; //add
добавить этот файл
app\Helpers\function.php
Ответ 16
Создать 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(); ?>
Ответ 17
Сначала создайте helpers.php внутри каталога App\Http. Затем добавьте следующий код внутри composer.json
"autoload": {
"classmap": [
"database"
],
"files": [
"app/Http/helpers.php"
],
"psr-4": {
"App\\": "app/"
}
},
Затем выполните следующую команду
composer dump-autoload
Теперь вы можете определить свою пользовательскую функцию внутри файла helpers.php.
Ответ 18
В 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, а помощники немного лучше организованы.
Надеюсь, это поможет кому-то.
Ответ 19
Здесь есть отличные ответы, но я думаю, что это самый простой.
В 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 автоматически разрешает конкретный класс.
Ответ 20
**
** создать нового помощника
<?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'));
}
}