Лучшие практики для пользовательских помощников в Laravel 5

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

view.blade.php

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

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

24 ответа

Решение

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

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

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

composer dump-autoload

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

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

Пользовательские классы в 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: Используйте его в своем шаблоне 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

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

Для начала я создал папку в моем app каталог называется Helpers, Тогда в пределах Helpers В папку я добавил файлы для функций, которые я хотел добавить. Наличие папки с несколькими файлами позволяет нам избежать одного большого файла, который становится слишком длинным и неуправляемым.

Затем я создал HelperServiceProvider.php выполнив команду ремесленника:

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. В нем также рассматривается предложение респондента использовать маппер и позволяет явно определять настраиваемые помощники для загрузки или по умолчанию автоматически загружать все файлы PHP в каталоге помощника. Отзывы и PR очень ценятся!

composer require browner12/helpers

Github: https://github.com/browner12/helpers

Это то, что предлагается JeffreyWay в этом обсуждении Laracasts.

  1. В вашем app/Http каталог, создать helpers.php файл и добавить свои функции.
  2. В composer.json, в autoload блок, добавить "files": ["app/Http/helpers.php"],
  3. Бежать 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>

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

Дополнительное чтение: https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives


Если вы хотите узнать, как лучше создавать собственные классы, которые можно использовать где угодно, см. Пользовательские классы в Laravel 5, Easy Way

Это мой файл 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 для загрузки статических файлов, таких как помощники.

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

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

Так как ОП попросил лучшие практики, я думаю, что здесь все еще не хватает хороших советов.

Отдельный файл helpers.php далек от хорошей практики. Во-первых, потому что вы смешиваете много разных видов функций, так что вы против хороших принципов кодирования. Кроме того, это может повредить не только документацию кода, но и метрики кода, такие как цикломатическая сложность, индекс ремонтопригодности иобъем Холстеда. Чем больше у вас функций, тем больше становится хуже.

Документация по коду была бы в порядке, если бы использовались такие инструменты, как 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.

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

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

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

и выполнить

composer dumpautoload

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

должен быть похож на это.

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

а затем к своему контроллеру включите помощника, используя метод 'use Helper', чтобы вы могли просто вызвать некоторые методы из вашего класса Helper.

eg. Helper::some_function();

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

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

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

Вот сценарий оболочки 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"

Бежать 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 (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 ""

Создайте пользовательский каталог помощников. Сначала создайте каталог помощников в каталоге приложения.Создание определения класса 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; определяет пространство имен помощников в пространстве имен приложений. Класс 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,

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

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

**

  • Статус Помощник

** создать новый помощник

<?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'));
        }
}

Сначала создайте helpers.php в каталоге App\Http. Затем добавьте следующий код в composer.json

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

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

composer dump-autoload

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

Создать 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"]
    },

использовать в контроллере

 используйте App\Helper\Helpers 

используйте изменение вида в файле config->app.php

   'aliases' => [
    ...
    'Helpers'   => 'App\Helper\Helpers'
    ],

вызов в поле зрения

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

Лучшая практика для написания пользовательских помощников

1) Внутри app каталог корневого каталога проекта, создайте папку с именем Helpers (просто для разделения и структурирования кода).

2) Внутри папки пишите файлы psr-4 или обычные файлы php

Если файлы PHP имеют формат psr-4, они будут загружены автоматически, в противном случае добавьте следующую строку в composer.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 если файл не загружен.

Другой способ, который я использовал, был: 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());

вот и все. и это работает

В директории начальной загрузки \autoload.php

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

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

app\Helpers\function.php

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

** сгруппируйте свои вспомогательные функции в классы (чтобы использовать функции в лезвии, просто сделайте их статическими) и поместите все классы в папку конфигурации Laravel app.php aliases

      'aliases' => [
  "YourClassName" => App\Support\YourClassName,
]

Теперь вы можете использовать все свои статические функции на блейд-серверах и контроллерах.

В 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 3!) И всего шесть глобальных функций, которые часто используются для форматирования даты и отладки. В глобальном пространстве имен нет столкновений с любыми другими функциями, и по своей сути они не являются объектно-ориентированными, так зачем делать их статическими методами в классе контейнера? Одна вещь, которая, на мой взгляд, хуже, чем слишком сильная зависимость от простых старых функций, - это упаковывать их в классы и вводить себя в заблуждение, заставляя вас думать, что вы делаете все правильно. Кроме того, иметь префикс этих вспомогательных функций с именем класса или псевдонимом класса просто ужасно больно, поэтому я предпочитаю хранить их как простые глобальные функции.

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

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

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

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

require __DIR__.'/helpers.php';

Тот другой ответ, который предложил изменить autoload.php был почти идеальный ответ (ИМО), за исключением того, что они предложили поставить function.php в app/Helpers папка. Как уже упоминалось выше, 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 разрешает конкретный класс автоматически.

Прежде всего, создайте свой вспомогательный файл/класс в App\Helpers\Helper.php, который выглядит следующим образом:

      <?php

namespace App\Helpers;

class Helper {

    // Your customer public function
}

И затем определите его в Composer.json при автозагрузке, а затем запустите composer dump-autoload

Создать новый файл examplehelper.php в App/Helpers/ а затем добавьте composer.json файл

      "autoload": { "classmap": [ "database"], "psr-4": { "App\\": "app/" },
"files": ["helpers/examplehelper.php" ]},
Другие вопросы по тегам