Я хотел бы создать вспомогательные функции, чтобы избежать повторения кода между представлениями в Laravel 5:
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
Это в основном функции форматирования текста. Где и как я могу создать файл с этими функциями?
php
laravel
laravel-5
laravel-helper
Калеб Оливейра
источник
источник
Пользовательские классы в Laravel 5, легкий путь
Этот ответ применим к общим пользовательским классам в Laravel. Для более подробного ответа о Blade см. Пользовательские директивы Blade в Laravel 5 .
Шаг 1. Создайте свой файл помощников (или другого пользовательского класса) и задайте ему соответствующее пространство имен. Напишите свой класс и метод:
Шаг 2: Создайте псевдоним:
Шаг 3: Запустить
composer dump-autoload
в корне проектаШаг 4: Используйте его в своем шаблоне Blade:
Дополнительный кредит: используйте этот класс в любом месте приложения Laravel:
Источник: 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
источник
aliases
массивapp/config.php
:'Helper' => App\Helpers\Helper::class,
Тогда вы сможетеHelper::prettyJson();
нормально вызывать blade.Моей первоначальной мыслью была также автозагрузка композитора, но она мне показалась не очень хорошей. L5 интенсивно использует поставщиков услуг, именно они запускают ваше приложение.
Для начала я создал папку в своем
app
каталоге с именемHelpers
. Затем вHelpers
папке я добавил файлы для функций, которые я хотел добавить. Наличие папки с несколькими файлами позволяет нам избежать одного большого файла, который становится слишком длинным и неуправляемым.Затем я создал
HelperServiceProvider.php
команду ремесленника:В
register
методе я добавил этот фрагментнаконец, зарегистрируйте поставщика услуг в вашем
config/app.php
списке поставщиковТеперь любой файл в вашем
Helpers
каталоге загружен и готов к использованию.ОБНОВЛЕНИЕ 2016-02-22
Здесь есть много хороших вариантов, но если мой ответ сработает для вас, я пошел дальше и составил пакет для включения помощников таким образом. Вы можете использовать пакет для вдохновения или загрузить его с помощью Composer. Он имеет несколько встроенных помощников, которые я часто использую (но которые по умолчанию неактивны) и позволяет вам создавать свои собственные помощники с помощью простого генератора Artisan. Он также учитывает предложение респондента об использовании картографа и позволяет явно определять настраиваемые помощники для загрузки или по умолчанию автоматически загружать все файлы PHP в каталоге помощников. Отзывы и PR очень ценятся!
Github: browner12 / helpers
источник
start.php
файле (что было не очень хорошо, но в то время служило своей цели). у вас есть другое предложение для загрузки нескольких файлов?Это то, что предлагается
JeffreyWay
в этом обсуждении Laracasts .app/Http
каталоге создайтеhelpers.php
файл и добавьте свои функции.composer.json
, вautoload
блоке, добавить"files": ["app/Http/helpers.php"]
.composer dump-autoload
.источник
app/helpers.php
или,app/Helpers/
кажется, лучше.composer dump-autoload
?composer dump-autoload
вы можете выполнить следующие действия: developers.be/2014/08/29/composer-dump-autoload-laravelПросеяв множество ответов о SO и Google, я все еще не мог найти оптимальный подход. Большинство ответов предполагают, что мы оставляем приложение и полагаемся на сторонний инструмент Composer для выполнения этой работы, но я не уверен, что подключение к инструменту просто для включения файла является разумным.
Ответ Эндрю Брауна был ближе всего к тому, как я думаю, к нему следует подходить, но (по крайней мере, в 5.1) шаг поставщика услуг не нужен. Ответ Хейсиана подчеркивает использование
PSR-4
которого приближает нас на один шаг. Вот моя последняя реализация для помощников во взглядах:Во-первых, создайте вспомогательный файл в любом месте каталога ваших приложений с пространством имен:
Далее, псевдоним вашего класса
config\app.php
вaliases
массиве:И это должно быть все, что вам нужно сделать.
PSR-4
и псевдоним должен предоставлять помощнику ваши представления, поэтому, по вашему мнению, если вы наберете:Это должно вывести:
источник
{!! bob() !!}
. собираюсь сделать еще поиск и посмотреть, возможно ли этоbob()
настоящему глобальным было бы неразумно. Пространства имен существуют по причине, и мы не должны вызыватьbob()
наряду с базовыми функциями PHP. Я добавлю ваш бит псевдонима в мой код - спасибо!extends Helper
? Это не кажется мне необходимым.extends Helper
действительно не нужно. Спасибо за внимание.Пользовательские директивы по лезвиям в Ларавел 5
Да, есть другой способ сделать это!
Шаг 1: Зарегистрируйте пользовательскую директиву Blade:
Шаг 2: Используйте пользовательскую директиву Blade:
Выходы:
ЭТО МОЙ ТАМОЖЕННЫЙ ДИРЕКТИВ ЛЕЗВИЯ!
Пользовательская ссылка
Источник: https://laravel.com/docs/5.1/blade#extending-blade
Дополнительное чтение: https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives
Если вы хотите узнать, как лучше создавать пользовательские классы, которые можно использовать где угодно , см. Пользовательские классы в Laravel 5, Easy Way
источник
Это мой файл HelpersProvider.php:
Вы должны создать папку с именем
Helpers
вapp
папке, затем создать файл с именемwhatever.php
внутри и добавить строкуwhatever
внутри массива $ helpers.Выполнено!
редактировать
Я больше не использую эту опцию, в настоящее время я использую Composer для загрузки статических файлов, таких как помощники.
Вы можете добавить помощников непосредственно по адресу:
источник
glob()
как писал Эндрю Браун? Если вы хотите иметь возможность указать файлы, которые вы хотите включить, почему бы не указать файлы вcomposer.json
для их автозагрузки, как написал Джозеф Силбер? Почему вы предпочитаете это решение? Я не говорю, что это плохое решение, мне просто любопытно.composer.json
за исключением двух моментов: во-первых, карта хранится в самом приложении, а не в файле метаданных; во-вторых, он не требует повторного запускаcomposer dump-autoload
каждый раз, когда вы меняете список файлов для загрузки.include
илиrequire
, Laravel уже имеет встроенную автозагрузку PSR-4: php-fig.org/psr/psr-4Для пользовательских вспомогательных библиотек в моем проекте Laravel я создал папку с именем
Libraries
в моемLaravel/App
каталоге и в каталоге библиотек, я создал различные файлы для разных вспомогательных библиотек.После создания моих вспомогательных файлов я просто включаю все эти файлы в мой файл composer.json следующим образом
и выполнить
источник
composer dump-autoload
иcomposer dumpautoload
также работает Infactcomposer du
также будет работать ...Так как ОП попросил лучшие практики , я думаю, что здесь все еще не хватает хороших советов.
Один 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 7.x.
источник
Вот сценарий оболочки bash, который я создал для очень быстрого создания фасадов Laravel 5.
Запустите это в вашем каталоге установки Laravel 5.
Назовите это так:
Пример:
Если запустить этот пример, он будет создавать каталоги
Facades
иProviders
под "your_laravel_installation_dir / приложение / MyApp.Он создаст следующие 3 файла и выведет их на экран:
После того, как это будет сделано, отобразится сообщение, подобное следующему:
Поэтому обновите список провайдеров и псевдонимов в «config / app.php»
Запустить
composer -o dumpautoload
«./App/MyApp/Facades/Helper.php» изначально будет выглядеть так:
Теперь просто добавьте ваши методы в "./app/MyApp/Facades/Helper.php".
Вот как выглядит «./app/MyApp/Facades/Helper.php» после того, как я добавил функцию Helper.
Эта функция ожидает шаблон и может принимать необязательный второй логический аргумент.
Если текущий URL совпадает с переданным ему шаблоном, он выведет «active» (или «class =« active »», если вы добавите «true» в качестве второго аргумента в вызов функции).
Я использую его, чтобы выделить меню, которое активно.
Ниже приведен исходный код моего скрипта. Я надеюсь, что вы найдете это полезным, и, пожалуйста, дайте мне знать, если у вас есть какие-либо проблемы с этим.
источник
вместо того, чтобы включать ваш собственный вспомогательный класс, вы можете добавить его в
config/app.php
файл под псевдонимами.должен быть похож на это.
а затем к своему контроллеру включите помощника, используя метод 'use Helper', чтобы вы могли просто вызвать некоторые методы в своем классе помощника.
или в представлении ресурсов вы можете напрямую вызвать класс Helper.
Но это все еще подход разработчика, которому нужно следовать. У нас может быть другой способ решения проблем, и я просто хочу поделиться тем, что у меня есть, для начинающих.
источник
Создайте пользовательский каталог помощников. Сначала создайте каталог помощников в каталоге приложения. Создание определения класса hlper. Теперь давайте создадим простую вспомогательную функцию, которая объединит две строки. Создайте новый файл MyFuncs.php в /app/Helpers/MyFuncs.php Добавьте следующий код
Пространство имен App \ Helpers; определяет пространство имен помощников в пространстве имен приложений. Класс MyFuncs {…} определяет вспомогательный класс MyFuncs. public static function full_name ($ first_name, $ last_name) {…} определяет статическую функцию, которая принимает два строковых параметра и возвращает объединенную строку
Служба помощи предоставляет класс
Поставщики услуг используются для автоматической загрузки классов. Нам нужно определить поставщика услуг, который будет загружать все наши вспомогательные классы в каталог / app / Helpers.
Запустите следующую команду ремесленника:
php artisan make: провайдер HelperServiceProvider
Файл будет создан в
/app/Providers/HelperServiceProvider.php
Добавьте следующий код:
ВОТ,
Теперь нам нужно зарегистрировать HelperServiceProvider и создать псевдоним для наших помощников.
Открыть
/config/app.php
файлНайдите переменную массива провайдеров
Добавьте следующую строку
Найдите переменную массива псевдонимов
Добавьте следующую строку
Сохраните изменения, используя наш пользовательский помощник
Мы создадим маршрут, который будет вызывать нашу пользовательскую вспомогательную функцию Open /app/routes.php
Добавьте следующее определение маршрута
ВОТ,
источник
Сначала создайте helpers.php в каталоге App \ Http. Затем добавьте следующий код в composer.json
Далее выполните следующую команду
Теперь вы можете определить свою пользовательскую функцию в файле helpers.php.
источник
Другой способ, который я использовал: 1) создал файл в app \ FolderName \ fileName.php и имел этот код внутри, т.е.
2) После этого в нашем клинке
это оно. и это работает
источник
Лучшая практика для написания пользовательских помощников
1) Внутри
app
каталога корневого каталога проекта создайте папку с именем Helpers (просто для разделения и структурирования кода).2) Внутри папки пишите файлы psr-4 или обычные файлы php
Если файлы PHP имеют формат psr-4, они будут загружены автоматически, в противном случае добавьте следующую строку в composer.json, который находится в корневом каталоге проекта.
Внутри
autoload
ключа создайте новый ключ с именемfiles
для загрузки файлов во время автоматической загрузки, внутриfiles
объекта добавьте путь, начиная с каталога приложения. Вот пример.PS: попробуйте запустить,
composer dump-autoload
если файл не загружен.источник
Создать Helpers.php в приложении / Helper / Helpers.php
Добавить в композитор и композитор обновление
использовать в контроллере
используйте видоизменение в файле config-> app.php
вызов в поле зрения
источник
composer.json
него бесполезно, поскольку автозагрузка psr-4 сделает эту работу.в директории начальной загрузки \ autoload.php
добавить этот файл
источник
**
** создать новый помощник
Используйте для контроллера и любого файла представления
источник
В laravel 5.3 и выше команда laravel переместила все процедурные файлы (
routes.php
) изapp/
каталога, и всяapp/
папкаpsr-4
автоматически загрузилась. Принятый ответ сработает в этом случае, но мне он не кажется правильным.Поэтому я создал
helpers/
каталог в корне своего проекта и поместил в него вспомогательные файлы, и в своемcomposer.json
файле я сделал это:Таким образом, мой
app/
каталог все еще загружается в psr-4, а помощники немного лучше организованы.Надеюсь, это кому-нибудь поможет.
источник
Здесь есть несколько отличных ответов, но я думаю, что это самый простой. В Laravel 5.4 (и, возможно, в более ранних версиях) вы можете создать класс где вам удобно, например, App / Libraries / Helper.php
Затем вы можете просто вызвать его в своем шаблоне Blade следующим образом:
Если вы не хотите использовать @inject, просто сделайте функцию uppercasePara статической и вставьте вызов в свой шаблон Blade следующим образом:
Нет необходимости в псевдонимах. Laravel разрешает конкретный класс автоматически.
источник