Рекомендации для пользовательских помощников на Laravel 5

Я хотел бы создать некоторые помощники (функции), чтобы избежать повторения кода между некоторыми представлениями в стиле L5:

вид.лезвие.в PHP

<p>Foo Formated text: {{ fooFormatText($text) }}</p>

они в основном функции форматирования текста. Где и как я могу поместить файл с этими функциями?

20 ответов


создать helpers.php файл в папке приложения и загрузить его с composer:

"autoload": {
    "classmap": [
        ...
    ],
    "psr-4": {
        "App\": "app/"
    },
    "files": [
        "app/helpers.php" // <---- ADD THIS
    ]
},

после добавления этого к вашему composer.json file, выполните следующую команду:

composer dump-autoload

Если вам не нравится держать свой в своем app каталог (потому что это не файл класса пространства имен PSR-4), Вы можете сделать то, что laravel.com сайт: магазин helpers.php в каталоге начальной загрузки. Не забудьте установить его в свой composer.json файл:

"files": [
    "bootstrap/helpers.php"
]

моя первоначальная мысль была автозагрузкой композитора, но она не казалась мне очень Laravel 5ish. L5 активно использует поставщиков услуг,они являются тем, что загружает ваше приложение.

для начала я создал папку в моих файл Helpers каталог загружен и готов к использованию.

обновление 2016-02-22

есть много хороших вариантов, но если мой ответ работает для вас, я пошел вперед и сделал пакет для включения помощников таким образом. Вы можете либо использовать пакет для вдохновения, либо скачать его с помощью Composer. Он имеет некоторые встроенные помощники, которые я часто использую (но которые по умолчанию неактивны), и позволяет создавать собственные пользовательские помощники с помощью простого генератора Artisan. Он также обращается к предложению одного ответчика использовать mapper и позволяет явно определить пользовательские помощники для загрузки или по умолчанию автоматически загружать все PHP-файлы в вашем вспомогательный каталог. Обратная связь и PRs очень ценятся!

composer require browner12/helpers

Github:browner12 / помощники


пользовательские классы в Laravel 5, простой способ

этот ответ применим к общие пользовательские классы в Laravel. Для получения более конкретного ответа на Blade см. пользовательские директивы лезвия в Laravel 5.

Шаг 1: создайте файл Helpers (или другой пользовательский класс) и дайте ему соответствующее пространство имен. Напишите свой класс и метод:

<?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: используйте его в шаблоне лезвия:

<!-- 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.

  1. в своем

просеяв множество ответов на SO и Google, я все еще не мог найти оптимальный подход. Большинство ответов предлагают оставить приложение и полагаться на 3rd party Tool Composer для выполнения этой работы, но я не уверен, что соединение с инструментом просто для включения файла разумно.

ответ Эндрю Брауна подошел ближе всего к тому, как я думаю, что к нему следует подойти, но (по крайней мере, в 5.1), шаг поставщика услуг не нужен. Heisian это подчеркивает использование PSR-4 что приближает нас на один шаг. Вот моя окончательная реализация для помощников в views:

сначала создайте вспомогательный файл в любом месте каталога приложений с пространством имен:

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>

пользовательские директивы лезвия в 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

выходы:

ЭТО МОЯ ПОЛЬЗОВАТЕЛЬСКАЯ ДИРЕКТИВА BLADE!!
Пользовательские Ссылке


источник: 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 внутри и добавьте строку whatever внутри массива $ helpers.

готово!

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

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

вы можете добавить помощников непосредственно в:

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

для пользовательских вспомогательных библиотек в моем проекте Laravel я создал папку с именем Libraries в своем Laravel/App каталог и в каталоге библиотек я создал различные файлы для разных вспомогательных библиотек.

после создания моих вспомогательных файлов я просто включаю все эти файлы в свой композитор.в JSON такой

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

и выполнить

composer dumpautoload

вместо того, чтобы включать свой пользовательский класс помощника, вы можете добавить в свой


так как OP попросил лучшие практики, Я думаю, нам все еще не хватает хороших советов.

один помощников.в PHP файл далек от хорошей практики. Во-первых, потому, что вы смешиваете много разных функций, поэтому вы против хороших принципов кодирования. Более того, это мог бы повредить не только документацию кода, но и показатели кода, такие как Цикломатическая Сложность, Ремонтопригодность Индекс и Объем Холстед. Чем больше у вас функций, тем хуже.

документация кода будет в порядке, используя такие инструменты, как документатора РНР, но через сами это не будет отображать процедурные файлы. Документация Laravel API-это такой случай - нет документации вспомогательных функций:https://laravel.com/api/5.4

метрики кода можно анализировать с помощью таких инструментов, как PhpMetrics. С помощью PhpMetrics Версия 1.x для анализа кода Laravel 5.4 framework даст вам очень плохие показатели CC/MI/HV для обоих src / Illuminate / Foundation / helpers.в PHP и src / подсветка / поддержка / помощники.в PHP файлы.

несколько контекстных вспомогательных файлов (например. string_helpers.в PHP, array_helpers.в PHP, etc.), безусловно, улучшит эти плохие показатели, что приведет к более простому коду для mantain. В зависимости от кода генератор документации, используемый этим, был бы достаточно хорош.

его можно улучшить, используя вспомогательные классы со статическими методами, чтобы они могли быть контекстуализированы с помощью пространств имен. Так же, как 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'.

он создаст следующие 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'

Run composer -o dumpautoload

в "./ app / MyApp / фасады / помощник.php " изначально будет выглядеть так:

<?php

namespace App\MyApp\Facades;


class Helper
{
    //
}

теперь просто добавьте ваши методы "./ app / MyApp / фасады / помощник.РНР."

вот что "./ app / MyApp / фасады / помощник.php " выглядит после того, как я добавил Вспомогательная функция.

<?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 )" -f <facade_name> -n '<namespace_prefix>'"
    echo ""
    echo "  Example:"
    echo "  ========"
    echo "      "$(basename ) -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=""
            case $key in
            -n|--namespace_prefix)
            namespace_prefix_in=""
            echo ""
            shift # past argument
            ;;
            -f|--facade)
            facade_name_in=""
            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/g')
    facade_name_upcase=$(echo ${facade_name_in} | sed -e 's/\b\(.\)/\u/')
    facade_name_lowercase=$(echo ${facade_name_in} | awk '{print tolower()}')


#   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 ""

создать каталог пользовательских помощников: Сначала создайте каталог помощников в App directory. создать определение класса hlper: Теперь давайте создадим простую вспомогательную функцию, которая объединит две строки. Создайте новый файл виде myfuncs.php в /app / помощники / 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 в разделе пространство имен App. класс MyFuncs { ... } определяет вспомогательный класс MyFuncs. публичная статическая функция full_name($имя,$фамилия) {...} определяет статическую функцию, которая принимает два строковых параметра и возвращает объединенную строку

служба помощников обеспечивает класс

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

выполните следующую команду artisan:

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 и создать псевдоним для наших помощников.

открыть

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

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

App\Providers\HelperServiceProvider::class,

подобрать массив алиасов переменная

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

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

Сохранить изменения Используя наш пользовательский помощник

мы создадим маршрут, который вызовет нашу пользовательскую вспомогательную функцию Open / 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

другой способ, который я использовал, был: 1) создал файл в app\FolderName\fileName.php и имел этот код внутри него.e

<?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 если файл не загружается.


в dir bootstrap\autoload.в PHP

require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../app/Helpers/function.php'; //add

добавить этот файл

app\Helpers\function.php

создать помощников.php внутри каталога App\Http. Затем добавьте следующий код внутри композитора.в JSON

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

далее выполните следующую команду

composer dump-autoload

теперь вы можете определить пользовательскую функцию внутри помощники.PHP-файл. Здесь вы можете получить полное руководство


я не согласен со всеми другими ответами на этот вопрос!

во-первых, нет ничего плохого в наличии нескольких глобальных вспомогательных функций. Например, приложению, над которым я сейчас работаю, пять лет (оно началось на Laravel 3!) и имеет в общей сложности всего шесть глобальных функций, которые часто используются для форматирования даты и отладки. Нет никаких столкновений с любыми другими функциями в глобальном пространстве имен, и по своей сути они являются не объектно-ориентированные, так зачем делать их статическими методами в классе контейнера? Одна вещь, которую я считаю хуже, чем полагаться слишком сильно на простые старые функции, - это упаковывать их в классы и обманывать себя, думая, что вы сейчас делаете что-то Правильно. Кроме того, префикс этих вспомогательных функций с именем класса или псевдонимом класса просто ужасно больно, поэтому я предпочитаю держать их как простые глобальные функции.

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

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

я заметил только один ответ, который рассматривал изменение bootstrap/autoload.php, который, по моему мнение, это абсолютно самое подходящее место для подключения. Нет правила, написанного или иного, которое говорит, что мы не должны изменять этот файл. Конечно, вам нужно проверить, изменяется ли он с одного выпуска Laravel на следующий, но то же самое касается файлов конфигурации, классов провайдеров, очереди и т. д.

поэтому я считаю, что самым простым и наиболее подходящим решением является создание файла в bootstrap папка с именем helpers.php и добавьте следующую строку в конце boostrap/autoload.php:

require __DIR__.'/helpers.php';

тот другой ответ, который предложил изменить autoload.php был почти идеальный ответ (ИМО), за исключением того, что они предложили положить function.php на


Создать Помощников.php в приложении / Helper / Helpers.в PHP

namespace App\Helper
class Helpers
{


}

добавить в composer и composer update

 "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'
    ],

call in view

<?php echo Helpers::function_name();  ?>

в laravel 5.3 и выше команда laravel переместила все процедурные файлы (routes.php) из и psr-4 подгружаться. Принятый ответ будет работать в этом случае, но он не кажется мне правильным.

так что я сделал, я создал helpers/ каталог в корне моего проекта и поместите вспомогательные файлы внутри этого и в мой composer.json файл я сделал это:

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

мой


здесь есть несколько отличных ответов, но я думаю, что это самый простой. В Laravel 5.4 (и prob более ранних версиях) вы можете создать класс где-нибудь удобно для вас, например, приложение/библиотеки/помощник.в PHP

class Helper() {
    public function uppercasePara($str) {
        return '<p>' .strtoupper($str). '<p>;
    }
}

тогда вы можете просто назвать его в своем шаблоне лезвия следующим образом:

@inject('helper', \App\Libraries\Helper)
{{ $helper->drawTimeSelector() }}

Если вы не хотите использовать @inject, просто сделайте функцию "uppercasePara" статической и вставьте вызов в свой шаблон Blade следующим образом:

{{ \App\Libraries\Helper::drawTimeSelector() }}

нет необходимости для псевдонимов. Laravel разрешает конкретный класс автоматически.