Я хотел бы создать вспомогательные функции, чтобы избежать повторения кода между представлениями в 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