Как создать пользовательские вспомогательные функции в Laravel
Я хочу создать вспомогательные функции, чтобы избежать дублирования кода между представлениями в Laravel. Например, у меня есть файл представления view.blade.php с следующим содержимым:
<p>Отформатированный текст Foo: {{ fooFormatText($text) }}</p>
Эти функции в основном занимаются форматированием текста. Как мне правильно определить глобально доступные вспомогательные функции, такие как fooFormatText()
?
5 ответ(ов)
Вот мой файл HelpersProvider.php:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HelperServiceProvider extends ServiceProvider
{
protected $helpers = [
// Здесь добавьте ваши вспомогательные функции
];
/**
* Инициализация сервисов приложения.
*/
public function boot()
{
//
}
/**
* Регистрация сервисов приложения.
*/
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",
...
]
},
...
В вашем проекте Laravel вы можете создать собственные вспомогательные библиотеки, организовав их в папке Libraries
внутри директории app
. Это хороший способ структурировать код и упростить его использование.
После создания файлов с вашими вспомогательными функциями, вы можете подключить их в файл composer.json следующим образом:
...
"autoload": {
"classmap": [
"database"
],
"files": [
"app/Libraries/commonFunctions.php"
],
"psr-4": {
"App\\": "app/"
}
},
...
Здесь можно добавить другие файлы с функциями в массив files
, если у вас есть несколько вспомогательных библиотек. После того как вы внесли изменения в composer.json
, не забудьте выполнить команду:
composer dump-autoload
Это позволит Composer обновить автозагрузку и сделать ваши функции доступными для использования в приложении. Если у вас возникнут какие-либо проблемы с доступом к функциям, убедитесь, что путь к файлам указан правильно и функции действительно определены в указанных файлах.
Вместо того, чтобы включать свой собственный вспомогательный класс напрямую, вы можете добавить его в файл config/app.php
в разделе aliases
. Это будет выглядеть следующим образом:
'aliases' => [
...
...
'Helper' => App\Http\Services\Helper::class,
]
Затем в вашем контроллере вы можете подключить Helper, используя метод use Helper
, так что вы сможете просто вызывать некоторые методы вашего класса Helper:
eg. Helper::some_function();
Или в представлениях ресурсов вы можете напрямую вызывать класс Helper:
eg. {{ Helper::foo() }}
Однако стоит помнить, что это лишь один из подходов к кодированию, который можно использовать. Существует множество способов решения задач, и я хотел бы поделиться этим методом, чтобы помочь новичкам.
Вот перевод вашего сообщения на русский язык, выполненный в стиле ответа на StackOverflow:
Вот скрипт для оболочки bash, который я создал, чтобы быстро генерировать фасады для Laravel 5.
Запустите его в директории вашей установки Laravel 5.
Вызовите его так:
make_facade.sh -f <имя_фасада> -n '<префикс_пространства_имен>'
Пример:
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
После выполнения скрипта вы увидите сообщение, похожее на следующее:
===========================
Завершено
===========================
Добавьте эти строки в config/app.php:
----------------------------------
Providers: App\MyApp\Providers\HelperServiceProvider,
Alias: 'Helper' => 'App\MyApp\Facades\HelperFacade',
Обновите список Providers и Alias в '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' ) : '');
}
}
Вот как это будет вызвано:
{!! Helper::isActive('help', true) !!}
Эта функция ожидает шаблон и может принимать необязательный второй булевый аргумент.
Если текущий URL соответствует переданному паттерну, она выведет 'active' (или 'class="active"', если вы добавите 'true' как второй аргумент).
Я использую это, чтобы выделить активное меню.
И вот исходный код моего скрипта. Надеюсь, он вам полезен, и дайте знать, если у вас возникнут с ним какие-то проблемы.
#!/bin/bash
display_syntax(){
echo ""
echo " Синтаксис таков:"
echo " ========================"
echo " "$(basename $0)" -f <имя_фасада> -n '<префикс_пространства_имен>'"
echo ""
echo " Пример:"
echo " ========"
echo " "$(basename $0) -f test -n "'App\MyAppDirectory'"
echo ""
}
if [ $# -ne 4 ]
then
echo ""
display_syntax
exit
else
while [[ $# > 0 ]]
do
key="$1"
case $key in
-n|--namespace_prefix)
namespace_prefix_in="$2"
echo ""
shift # пропустить аргумент
;;
-f|--facade)
facade_name_in="$2"
shift # пропустить аргумент
;;
*)
# несуществующий параметр
;;
esac
shift # пропустить аргумент или значение
done
fi
echo Имя фасада = ${facade_name_in}
echo Префикс пространства имен = $(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
echo ""
}
function display_start_banner(){
echo '**********************************************************'
echo '* ЗАПУСК СКРИПТА СОЗДАНИЯ ФАСАДА LARAVEL'
echo '**********************************************************'
}
function init_and_export_vars(){
echo
echo "ИНИЦИАЛИЗАЦИЯ И ЭКСПОРТ ПЕРЕМЕННЫХ"
echo "===================="
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)}')
# Шаблоны файлов:
source_template='<?php
namespace {namespace_prefix}\Facades;
class {facade_name_upcase}
{
//
}
'
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_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 "Не удается найти пространство имен: "${namespace_prefix_in}
echo ""
echo "*** ЗАМЕТКА:"
echo " Убедитесь, что директория пространства имен существует и"
echo " вы используете кавычки вокруг префикса пространства имен."
echo ""
display_syntax
exit
fi
}
function makeDirectories(){
echo "Создание директорий"
echo "================"
mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
mkdir -p ${namespace_prefix_lowerfirstchar}/Providers
}
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 "Создание шаблона источника:"
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 "Создание шаблона провайдера сервиса:"
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 "Создание шаблона фасада:"
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,"
}
###########################
## НАЧАЛО ЗАПУСКА СКРИПТА ##
###########################
display_start_banner
init_and_export_vars
makeDirectories
checkDirectoryExists
echo ""
createSourceTemplate
createServiceProviderTemplate
createFacadeTemplate
echo ""
echo "==========================="
echo " Завершено"
echo "==========================="
echo ""
echo "Добавьте эти строки в config/app.php:"
echo "----------------------------------"
serviceProviderPrompt
aliasPrompt
echo ""
Надеюсь, это поможет вам создать фасады для Laravel 5! Если у вас возникнут вопросы, не стесняйтесь задавать их.
Создание пользовательского каталога для хелперов
- Сначала создайте каталог
Helpers
в директорииapp
.
Создание определения класса хелпера
Создайте простую хелпер-функцию, которая будет объединять две строки.
Создайте новый файл
MyFuncs.php
в/app/Helpers/MyFuncs.php
и добавьте следующий код:<?php namespace App\Helpers; // определяет пространство имен Helpers в пространстве имен App. class MyFuncs { // определяет хелпер-класс MyFuncs. // Определяет статическую функцию, принимающую два строковых параметра и возвращающую объединенную строку public static function full_name($first_name, $last_name) { return $first_name . ', ' . $last_name; } }
Сервис-провайдеры используются для автоматической загрузки классов. Нам нужно будет определить сервис-провайдер, который загрузит все наши классы хелперов из директории /app/Helpers
.
Запустите следующую команду Artisan:
php artisan make:provider HelperServiceProvider
Файл будет создан в /app/Providers/HelperServiceProvider.php
. Откройте /app/Providers/HelperServiceProvider.php
и добавьте следующий код:
<?php
namespace App\Providers; // определяет пространство имен провайдера
use Illuminate\Support\ServiceProvider; // импортирует пространство имен класса ServiceProvider
// определяет класс HelperServiceProvider, который расширяет класс ServiceProvider
class HelperServiceProvider extends ServiceProvider {
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
// перебирает все файлы в каталоге /app/Helpers и загружает их.
foreach (glob(app_path().'/Helpers/*.php') as $filename) {
require_once($filename);
}
}
}
Теперь нам нужно зарегистрировать HelperServiceProvider
и создать алиас для наших хелперов.
Откройте файл /config/app.php
.
Найдите переменную массива providers.
Добавьте следующую строку:
App\Providers\HelperServiceProvider::class,
Найдите переменную массива aliases.
Добавьте следующую строку:
'MyFuncs' => App\Helpers\MyFuncs::class,
Сохраните изменения, используя наш собственный хелпер.
Мы создадим маршрут, который будет вызывать нашу функцию хелпера, откройте /app/routes.php
.
Добавьте следующее определение маршрута:
Route::get('/func', function () {
return MyFuncs::full_name("John", "Doe");
});
Здесь:
return MyFuncs::full_name("John", "Doe"); вызывает статическую функцию full_name в классе MyFuncs.
Как вывести сырой SQL-запрос в виде строки из билдера запросов?
Как удалить пакет из Laravel с помощью PHP Composer?
Как создать запрос с несколькими условиями WHERE с использованием Laravel Eloquent?
Что такое потокобезопасность и непотокобезопасность в PHP?
Вставка нового элемента в массив в любом месте в PHP