Web

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

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

view.blade.php

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

 

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

 

Ответ 1

Создайте файл 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"

]

 

Совет: если вы хотите использовать другое имя файла вместо helpers, вы можете изменить имя файла и путь. Также вы можете создать несколько вспомогательных файлов. Это будет выглядеть так:

"autoload": {

    "classmap": [

        ...

    ],

    "psr-4": {

        "App\\": "app/"

    },

    "files": [

        "app/Helpers/base.php", // <---- ЭТО ЗДЕСЬ

        "app/Helpers/metrics.php" // <---- Создайте файл `metrics.php` по этому пути и добавьте путь в файл composer.json.

    ]

},

 

Ответ 2

Пользовательские классы в Laravel 5, легкий путь.

Этот ответ применим к обычным пользовательским классам в Laravel. Более подробный ответ, относящийся к Blade, см. в разделе Custom Blade Directives в Laravel 5.

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

<?php // код с app\Helpers\Helper.php

namespace App\Helpers;

class Helper {

    public static function shout(string $string) {

        return strtoupper($string);

    }

}

 

Шаг 2: Создайте псевдоним:

<?php // код с config/app.php

    'aliases' => [

     ...

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

     ...

Шаг 3. Запустите composer dump-autoload в корне проекта.

Шаг 4: Используйте его в своем шаблоне Blade:

<!— код с resources/views/template.blade.php -->

 {!! Helper::shout('вот как правильно использовать автозагрузку!!!') !!}

 Дополнительно: используйте этот класс в любом месте вашего приложения Laravel:

<?php // код с app/Http/Controllers/SomeController.php

namespace App\Http\Controllers;

use Helper;

class SomeController extends Controller {

    public function __construct() {

        Helper::shout('теперь я использую свой класс-помощник в контроллере!!!');

    }

    ...

 

Ответ 3

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

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

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

artisan make:provider HelperServiceProvider

В методе register я добавил этот фрагмент:

public function register() {

    foreach (glob(app_path().'/Helpers/*.php') as $filename){

        require_once($filename);

    }

}

Наконец, зарегистрируйте поставщика услуг в своем config/app.php массиве поставщиков:

'providers' => [

    'App\Providers\HelperServiceProvider',

]

Теперь любой файл в вашем каталоге Helpers, загружен и готов к использованию.

ДОПОЛНИТЕЛЬНО.

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

composer require browner12/helpers

 

 

Ответ 4

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

Вот моя последняя реализация помощников в представлениях:

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

namespace App\Helpers;

class BobFinder {

    static function bob() {

        return '<strong>Вася?! Это ты?!</strong>';

    }

}

 

Затем укажите псевдоним вашего класса config\app.php в массиве aliases:

'aliases' => [

    // Прочие псевдонимы

    'BobFinder' => App\Helpers\BobFinder::class

]

И это должно быть все, что вам нужно сделать. PSR-4-псевдоним должен предоставлять помощника вашим представлениям, поэтому, если вы наберете:

{!! BobFinder::bob() !!},

он должен выводить:

<strong>Вася?! Это ты?!</strong>

 



Ответ 5

Использовать пользовательские директивы Blade в Laravel 5.

Да, есть еще один способ сделать это!

Шаг 1. Зарегистрируйте настраиваемую директиву Blade:

<?php // код из app/Providers/AppServiceProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use Blade; // <-- Это очень важно! Без него вы получите исключение.

class AppServiceProvider extends ServiceProvider {

    /**

     * Загрузка любых служб приложения.

     *

     * @return void

     */

     public function boot() {

         // Создайте пользовательскую директиву blade:

         Blade::directive('shout', function ($string) {

             return trim(strtoupper($string), '(\'\')');

         });

         // И еще один, на всякий случай:

         Blade::directive('customLink', function () {

             return '<a href="#">Некоторая ссылка</a>';

         });

     }

    ...

Шаг 2: Используйте свою настраиваемую директиву Blade:

<!-- // код из resources/views/view.blade.php -->

@shout('это моя индивидуальная директива blade!!!')

<br />

@customLink

 

Схожие статьи

Web

Как мне получить имя файла из полного пути с помощью PHP

Web

Как усечь строку в PHP до слова, ближайшего к определенному количеству символов

Самые полезные расширения для Google Chrome для веб-разработчика
Web

Самые полезные расширения для Google Chrome для веб-разработчика

Web

Допустимо ли использование коротких тегов PHP?