Кращі практики для користувальницьких помічників у Laravel 5 [закрито]


472

Я хотів би створити допоміжні функції, щоб уникнути повторення коду між переглядами в Laravel 5:

view.blade.php

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

Вони в основному функції форматування тексту. Де і як можна створити файл із цими функціями?

Відповіді:


595

Створіть helpers.phpфайл у папці програми та завантажте його разом із композитором:

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

85
Порада для noobs: використовуйте цю команду після зміни composer.json. композитор dump-autoload
Allfarid Morales García

11
@ AllfaridMoralesGarcía Або, можливо, просто "Корисна порада, оскільки відповідь не дає зрозуміти, що потрібно робити це згодом".
Метт Макдональд

8
Я схвалюю допоміжні функції, щоб полегшити написання поглядів, але ненавиджу, наскільки ця відповідь посилається на інші відповіді. Не зрозумійте мене неправильно, це гарна відповідь і правильно, я просто боюся, що люди зловживають цим і знову почнуть писати тонни погано написаного, погано організованого функціонального PHP.
andrewtweber

39
Я не розумію такого підходу. Композитор повинен бути інструментом для включення бібліотек: Laravel прекрасно працював би без нього, а Composer - без Laravel. Ця пропозиція дозволяє нам створити файл у нашому додатку, залишити додаток, перейти до композитора, сказати композитору повернутися в наш додаток і включити файл. Laravel чітко справляється з включенням файлів, правда? Чому б ми відмовились від власного впровадження Laravel і використали цей зовнішній інструмент для включення файлу для нас, тим самим зв’язавши наше додаток із Composer більше? Це лінь чи я щось пропускаю?
dKen

6
Laravel використовує автозавантажувач композитора, щоб знати, куди включити всі бібліотеки та файли, на які він покладається. На це посилається у bootstrap / autoload.php. Прочитайте коментар у цьому файлі. Підхід полягає в тому, щоб додати посилання на файл у composer.json, а потім "скинути автозавантаження", що відновлює автозавантажувач композитора, щоб Laravel міг його знайти. Використання композиції "Файли" колекції - хороший спосіб додати бібліотеки або одноразові файли функцій, які не акуратно загорнуті в композиторські пакети. Приємно мати місце для всіх ситуацій "до речі, я повинен включати цей дивний файл".
Філіп Харрінгтон

370

Спеціальні класи в Laravel 5, простий шлях

Ця відповідь застосовна для загальних спеціальних класів у Laravel. Для отримання більш конкретної відповіді на лезо див. Спеціальні директиви щодо леза в 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: Запустіть 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


35
Щоб було зрозуміло, ця відповідь насправді не стосується помічників, які є функціями просторового простору. Натомість він заохочує перетворювати помічників на методи класу. Це, як правило, найкращий підхід, але насправді не відповідає на поставлене тут питання, тому інші порівняння настільки складні порівняно.
Дан Хунсакер

1
Функціональний помічник означає, що він доступний і в Blade. Як ви робите цю функцію доступною у леза? Ви не можете викликати Helper :: prettyJason (параметри) в клинку.
MaXi32

@ MaXi32 ви можете додати клас під aliasesмасив у app/config.php: 'Helper' => App\Helpers\Helper::class, Тоді ви зможете зателефонуватиHelper::prettyJson(); в блейд.
heisian

@DanHunsaker відредаговано, щоб безпосередньо відповісти на питання, і це все одно той же простий підхід. Ви також можете просто написати свої власні директиви для користувача лез: stackoverflow.com/questions/28290332 / ...
heisian

1
Так, я перекопав рамку одного разу і виявив, куди вони підтягнули помічників. І знову ж таки, я повністю згоден, що методи статичних класів з розміщеними іменами набагато чистіші, ніж те, що просять - або рекомендують - більшість часу. Справа в тому, що помічники - це не в першу чергу The Laravel Way, а скоріше перехід від CodeIgniter 2.x, який досі не припинено. Тож моя педантичність щодо такого підходу, що не відповідає ОП так, як просили, - це більше спроба підкреслити той факт, що ви не отримуєте помічників, а щось краще.
Ден Хунсакер

315

моя первісна думка також була автозавантаженням композитора, але це не дуже відчувало Laravel 5ish для мене. L5 широко використовує Постачальників послуг, саме вони завантажують Вашу програму.

Для початку я створив папку в моєму appкаталозі під назвою Helpers. Потім у Helpersпапку я додав файли для функцій, які хотів додати. Наявність папки з кількома файлами дозволяє нам уникнути одного великого файлу, який стає занадто довгим і некерованим.

Далі я створив HelperServiceProvider.phpкоманду a, виконавши команду ремісника:

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: браунер12 / помічники


29
Для людей, які мають лише кілька функцій, які потрібно додати, автоматичне завантаження композитора ідеально, але для тих із нас, хто може мати багато допоміжних функцій, необхідна організація декількох файлів. це рішення, по суті, те, що я робив у L4, за винятком того, що я зареєстрував файли у своєму start.phpфайлі (що було не чудово, але слугувало своєму призначенню на час). у вас є ще одна пропозиція щодо завантаження декількох файлів?
Ендрю Браун

7
Якщо у вас є кілька файлів, додайте їх усі до файлу composer.json. Додавання навіть 5-10 ліній там робить шлях більше сенсу , ніж те , що ви тут.
Джозеф Сільбер

22
Я думаю, що ця методика має багато заслуг. Це елегантно і ефективно, тому що вам не потрібно пам’ятати, щоб возитися з файлом composer.json кожного разу, коли ви створюєте файл-помічник.
імпето

8
Дійсно гарне рішення. Єдине, з чим я не згоден, - це те, як ви додаєте файли, я вважаю, що замість цього повинен бути картограф, де ми додаємо ім'я файлу, який ми хочемо завантажити. Подумайте про помилки! якщо в одному з файлів, який виходить з ладу, є лише один помічник, то слід видалити їх, або порушити сайт, поки ви не вирішите його.
Пабло Езекіїль Леоне

3
Чи використовуєте Ви простір імен додатків \ Провайдерів? Як я називаю цього помічника від контролера та перегляду. Вибачте, noob питання.
Cengkaruk

79

Це те, що пропонується JeffreyWayу цій дискусії про Laracasts .

  1. У своєму app/Httpкаталозі створітьhelpers.php файл і додайте свої функції.
  2. Всередині composer.json, у autoloadблоці, додайте"files": ["app/Http/helpers.php"] .
  3. Біжи composer dump-autoload.

15
Помічники можуть бути не лише HTTP. app/helpers.phpабо, app/Helpers/здається, краще місце.
sepehr

1
Що робити, якщо ми на спільному сервері і не маємо можливості використовувати composer dump-autoload ?
user3201500

@ user3201500 - це інше питання, і вам, можливо, доведеться це зробити вручну, якщо ви хочете слідувати вищевказаній відповіді. Або ви можете вибрати з інших відповідей. І вручну відображати composer dump-autoloadви можете стежити за цим: developed.be/2014/08/29/composer-dump-autoload-laravel
itsazzad

55

Ознайомившись з різноманітними відповідями на 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>

дякую за повідомлення про це. Як @ Dan-Hunsaker вказував у своєму рішенні, ми все ще не закінчилися функцією, що має глобальний простір, тобто вміти писати просто {!! bob() !!}. збирається зробити ще кілька пошуків і побачити, чи це можливо
heisian

1
Я більше про це думав, і намагатися зробити bob()по-справжньому глобальним не було б розумною справою. Простори імен існують не просто так, і нам не слід телефонувати bob()поряд із базовими функціями PHP. Я додаю твій штрих-псевдонім до мого коду - дякую!
heisian

1
Я вважаю це найкращим з усіх
Джиммі Обеніо Абор

Чому там extends Helper? Мені це не здається необхідним.
bernie

@bernie @ user3201500 Команда вибачте, у мене був власний базовий клас помічників, від якого успадковуються всі мої помічники; extends Helperдійсно не потрібно. Дякую за голову вгору
dKen

31

Спеціальні директиви щодо лез у 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, Легкий шлях


Це слід відзначити найкращою відповіддю, оскільки питання було "уникнути повторення коду між деякими поглядами". Ключове слово - VIEWS. :)
Олександр

23

Це мій файл 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",
        ...
    ]
},
...

Чи є інші причини, ніж продуктивність, щоб створити картограф, а не завантажувати всі файли в каталозі, glob()як написав Ендрю Браун? Якщо ви хочете мати можливість вказати файли, які ви хочете включити, то чому б не вказати файли у програмі composer.jsonдля автоматичного завантаження, як написав Джозеф Сілбер? Чому ви віддаєте перевагу цьому рішенню? Я не кажу, що це погане рішення, я просто цікавий.
Пелмед

3
Простіше, за допомогою картографічного підходу, вибірково включати / вимикати помічників, якщо, наприклад, один із помічників містить помилку зриву. Однак, відображення файлів у постачальника послуг не сильно відрізняється від цього, за composer.jsonвинятком двох пунктів - по-перше, він зберігає карту всередині самої програми, а не файл метаданих; по-друге, це не вимагає повторного запуску composer dump-autoloadкожного разу, коли ви змінюєте список файлів для завантаження.
Ден Хунсакер

Не потрібно includeабо require, Laravel вже має вбудовану автоматичну завантаження PSR-4: php-fig.org/psr/psr-4
heisian

1
використання PSR-4 і композитора не дозволять вам включати / вимикати помічників.
Пабло Езекіель Леоне

@PabloEzequielLeone і як я можу використовувати його всередині контролера або файлу леза? Це виглядає як найкращий варіант, якщо ви переймаєтеся тим, щоб не завантажувати всіх помічників для всіх контролерів кожного разу, але це не добре для початківців Laravel (як я).
VinGarcia

12

Для спеціальних бібліотек помічників у проекті Laravel я створив папку з назвою Librariesв моємуLaravel/App каталозі та в каталозі бібліотек, створив різні файли для різних бібліотек помічників.

Після створення моїх файлів-помічників я просто включаю всі ці файли у свій файл composer.json, як це

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

і виконати

composer dump-autoload

composer dump-autoloadа composer dumpautoloadтакож працює інфакт composer du, також буде працювати ...
Акшай Хале

10

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

Один файл helpers.php далеко не належна практика. По-перше, тому, що ви змішуєте безліч різноманітних функцій, значить, ви проти хороших принципів кодування. Більше того, це може зашкодити не тільки кодовій документації, а й метриці коду, як цикломатична складність , індекс ремонтопридатності та обсяг Halstead . Чим більше функцій у вас, тим більше стає гірше.

Документація з кодом була б у порядку, використовуючи такі інструменти, як phpDocumentor , але використовуючи самі вона не надаватиме процедурні файли . Документація 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 / аргументи).
Я особисто використовую динамічний підхід з 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.


8

Ось сценарій bash shell, який я створив, щоб зробити фасади 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 ""

8

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

має виглядати так.

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

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

eg. Helper::some_function();

або в режимі перегляду ресурсів ви вже можете безпосередньо зателефонувати до класу Helper.

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

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


4

Створіть спеціальний довідник помічників: Спершу створіть каталог Helpers у каталозі додатків. Створіть визначення класу hlper: Давайте тепер створимо просту функцію помічника, яка об'єднає два рядки. Створіть новий файл MyFuncs.php в /app/Helpers/MyFuncs.php Додати наступний код

<?php

namespace App\Helpers;

class MyFuncs {

    public static function full_name($first_name,$last_name) {
        return $first_name . ', '. $last_name;   
    }
}

простір імен App \ Helpers; визначає простір імен Helpers у просторі імен додатків. клас 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

4

Спочатку створіть helpers.php у каталозі App \ Http. Потім додайте наступний код всередині composer.json

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

Далі запустіть наступну команду

composer dump-autoload

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


3

Ще один спосіб, який я використав: 1) створив файл у програмі \ 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());

Це воно. і це працює


3

Найкраща практика написання користувальницьких помічників

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якщо файл не завантажений.


3

Створіть 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"]
    },

використання в контролері

використовувати додаток \ помічник \ помічники

використовувати для перегляду зміну у файлі config-> app.php

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

передзвоніть

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

Дякую, чи не могли б ви трохи розширити своє пояснення?
Феліпе Вальдес

2
Якщо клас має простір імен, додавання файлу в composer.jsonмарно, оскільки автоматичне завантаження psr-4 зробить роботу.
Арсесілас

2

в dir bootstrap \ autoload.php

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

додати цей файл

app\Helpers\function.php

2

**

  • Статус помічник

** створити нового помічника

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

0

У версії 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, і помічники трохи краще організовані.

Сподіваюся, що це комусь допоможе.


0

Тут є кілька чудових відповідей, але я думаю, що це найпростіше. У 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, просто зробіть функцію 'верхній регістрPara' статичною і вбудуйте виклик у свій шаблон Blade таким чином:

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

Не потрібно псевдонімів. Laravel вирішує конкретний клас автоматично.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.