6

Как создать пользовательские вспомогательные функции в Laravel

16

Я хочу создать вспомогательные функции, чтобы избежать дублирования кода между представлениями в Laravel. Например, у меня есть файл представления view.blade.php с следующим содержимым:

<p>Отформатированный текст Foo: {{ fooFormatText($text) }}</p>

Эти функции в основном занимаются форматированием текста. Как мне правильно определить глобально доступные вспомогательные функции, такие как fooFormatText()?

5 ответ(ов)

0

Вот мой файл HelpersProvider.php:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider
{
    protected $helpers = [
        // Здесь добавьте ваши вспомогательные функции
    ];

    /**
     * Инициализация сервисов приложения.
     */
    public function boot()
    {
        //
    }

    /**
     * Регистрация сервисов приложения.
     */
    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.

Готово!

Редактировать

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

Вы можете добавить вспомогательные напрямую в секцию:

...
"autoload": {
    "files": [
        "app/helpers/my_helper.php",
        ...
    ]
},
...
0

В вашем проекте Laravel вы можете создать собственные вспомогательные библиотеки, организовав их в папке Libraries внутри директории app. Это хороший способ структурировать код и упростить его использование.

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

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

Здесь можно добавить другие файлы с функциями в массив files, если у вас есть несколько вспомогательных библиотек. После того как вы внесли изменения в composer.json, не забудьте выполнить команду:

composer dump-autoload

Это позволит Composer обновить автозагрузку и сделать ваши функции доступными для использования в приложении. Если у вас возникнут какие-либо проблемы с доступом к функциям, убедитесь, что путь к файлам указан правильно и функции действительно определены в указанных файлах.

0

Вместо того, чтобы включать свой собственный вспомогательный класс напрямую, вы можете добавить его в файл config/app.php в разделе aliases. Это будет выглядеть следующим образом:

'aliases' => [ 
    ...
    ...
    'Helper' => App\Http\Services\Helper::class,
]

Затем в вашем контроллере вы можете подключить Helper, используя метод use Helper, так что вы сможете просто вызывать некоторые методы вашего класса Helper:

eg. Helper::some_function();

Или в представлениях ресурсов вы можете напрямую вызывать класс Helper:

eg. {{ Helper::foo() }}

Однако стоит помнить, что это лишь один из подходов к кодированию, который можно использовать. Существует множество способов решения задач, и я хотел бы поделиться этим методом, чтобы помочь новичкам.

0

Вот перевод вашего сообщения на русский язык, выполненный в стиле ответа на StackOverflow:


Вот скрипт для оболочки bash, который я создал, чтобы быстро генерировать фасады для Laravel 5.

Запустите его в директории вашей установки Laravel 5.

Вызовите его так:

make_facade.sh -f <имя_фасада> -n '<префикс_пространства_имен>'

Пример:

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

После выполнения скрипта вы увидите сообщение, похожее на следующее:

===========================
    Завершено
===========================

Добавьте эти строки в config/app.php:
----------------------------------
Providers: App\MyApp\Providers\HelperServiceProvider,
Alias: 'Helper' => 'App\MyApp\Facades\HelperFacade',

Обновите список Providers и Alias в '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' ) : '');
    }
}

Вот как это будет вызвано:

{!! Helper::isActive('help', true) !!}

Эта функция ожидает шаблон и может принимать необязательный второй булевый аргумент.

Если текущий URL соответствует переданному паттерну, она выведет 'active' (или 'class="active"', если вы добавите 'true' как второй аргумент).

Я использую это, чтобы выделить активное меню.

И вот исходный код моего скрипта. Надеюсь, он вам полезен, и дайте знать, если у вас возникнут с ним какие-то проблемы.

#!/bin/bash

display_syntax(){
    echo ""
    echo "  Синтаксис таков:"
    echo "  ========================"
    echo "      "$(basename $0)" -f <имя_фасада> -n '<префикс_пространства_имен>'"
    echo ""
    echo "  Пример:"
    echo "  ========"
    echo "      "$(basename $0) -f test -n "'App\MyAppDirectory'"
    echo ""
}

if [ $# -ne 4 ]
then
    echo ""
    display_syntax
    exit
else
    while [[ $# > 0 ]]
    do
        key="$1"
        case $key in
            -n|--namespace_prefix)
                namespace_prefix_in="$2"
                echo ""
                shift # пропустить аргумент
                ;;
            -f|--facade)
                facade_name_in="$2"
                shift # пропустить аргумент
                ;;
            *)
                # несуществующий параметр
                ;;
        esac
        shift # пропустить аргумент или значение
    done
fi
echo Имя фасада = ${facade_name_in}
echo Префикс пространства имен = $(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
echo ""
}

function display_start_banner(){
    echo '**********************************************************'
    echo '*          ЗАПУСК СКРИПТА СОЗДАНИЯ ФАСАДА LARAVEL'
    echo '**********************************************************'
}

function init_and_export_vars(){
    echo
    echo "ИНИЦИАЛИЗАЦИЯ И ЭКСПОРТ ПЕРЕМЕННЫХ"
    echo "===================="
    
    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)}')

    # Шаблоны файлов:
    source_template='<?php
namespace {namespace_prefix}\Facades;
class {facade_name_upcase}
{
    //
}
'

    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_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 "Не удается найти пространство имен: "${namespace_prefix_in}
        echo ""
        echo "*** ЗАМЕТКА:"
        echo "           Убедитесь, что директория пространства имен существует и"
        echo "           вы используете кавычки вокруг префикса пространства имен."
        echo ""
        display_syntax
        exit
    fi
}

function makeDirectories(){
    echo "Создание директорий"
    echo "================"
    mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
    mkdir -p ${namespace_prefix_lowerfirstchar}/Providers
}

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 "Создание шаблона источника:"
    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 "Создание шаблона провайдера сервиса:"
    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 "Создание шаблона фасада:"
    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," 
}

###########################
## НАЧАЛО ЗАПУСКА СКРИПТА ##
###########################

display_start_banner

init_and_export_vars
makeDirectories
checkDirectoryExists
echo ""

createSourceTemplate
createServiceProviderTemplate
createFacadeTemplate
echo ""
echo "==========================="
echo "  Завершено"
echo "==========================="
echo ""
echo "Добавьте эти строки в config/app.php:"
echo "----------------------------------"
serviceProviderPrompt
aliasPrompt
echo ""

Надеюсь, это поможет вам создать фасады для Laravel 5! Если у вас возникнут вопросы, не стесняйтесь задавать их.

0

Создание пользовательского каталога для хелперов

  • Сначала создайте каталог Helpers в директории app.

Создание определения класса хелпера

  • Создайте простую хелпер-функцию, которая будет объединять две строки.

  • Создайте новый файл MyFuncs.php в /app/Helpers/MyFuncs.php и добавьте следующий код:

    <?php
    
    namespace App\Helpers; // определяет пространство имен Helpers в пространстве имен App.
    
    class MyFuncs { // определяет хелпер-класс MyFuncs.
    
        // Определяет статическую функцию, принимающую два строковых параметра и возвращающую объединенную строку
        public static function full_name($first_name, $last_name) {
            return $first_name . ', ' . $last_name;   
        }
    }
    

Сервис-провайдеры используются для автоматической загрузки классов. Нам нужно будет определить сервис-провайдер, который загрузит все наши классы хелперов из директории /app/Helpers.

Запустите следующую команду Artisan:

php artisan make:provider HelperServiceProvider

Файл будет создан в /app/Providers/HelperServiceProvider.php. Откройте /app/Providers/HelperServiceProvider.php и добавьте следующий код:

<?php 

namespace App\Providers; // определяет пространство имен провайдера 

use Illuminate\Support\ServiceProvider; // импортирует пространство имен класса ServiceProvider

// определяет класс HelperServiceProvider, который расширяет класс ServiceProvider
class HelperServiceProvider extends ServiceProvider {

   /**
    * Bootstrap the application services.
    *
    * @return void
    */
   public function boot()
   {
      //
   }

   /**
    * Register the application services.
    *
    * @return void
    */
   public function register()
   {    
        // перебирает все файлы в каталоге /app/Helpers и загружает их.
        foreach (glob(app_path().'/Helpers/*.php') as $filename) {
            require_once($filename);
        }
   }
}

Теперь нам нужно зарегистрировать HelperServiceProvider и создать алиас для наших хелперов.

Откройте файл /config/app.php.

Найдите переменную массива providers.

Добавьте следующую строку:

App\Providers\HelperServiceProvider::class,

Найдите переменную массива aliases.

Добавьте следующую строку:

'MyFuncs' => App\Helpers\MyFuncs::class,

Сохраните изменения, используя наш собственный хелпер.

Мы создадим маршрут, который будет вызывать нашу функцию хелпера, откройте /app/routes.php.

Добавьте следующее определение маршрута:

Route::get('/func', function () {
    return MyFuncs::full_name("John", "Doe");
});

Здесь:

return MyFuncs::full_name("John", "Doe"); вызывает статическую функцию full_name в классе MyFuncs.
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь