Я хотел бы создать вспомогательные функции, чтобы избежать повторения кода между представлениями в Laravel 5:
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
Это в основном функции форматирования текста. Где и как я могу создать файл с этими функциями?
Создать 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"]
Моей первоначальной мыслью была также автозагрузка композитора, но она мне не очень понравилась. L5 интенсивно использует поставщиков услуг, именно они запускают ваше приложение.
Для начала я создал папку в моем app
каталог называется Helpers
, Тогда в пределах Helpers
В папку я добавил файлы для функций, которые я хотел добавить. Наличие папки с несколькими файлами позволяет нам избежать одного большого файла, который становится слишком длинным и неуправляемым.
Затем я создал HelperServiceProvider.php
выполнив команду ремесленника:
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: browner12 / хелперы
Этот ответ применим к генеральный пользовательские классы в Laravel. Для более конкретного ответа Blade см. Пользовательские директивы по лезвиям в Ларавел 5.
Шаг 1: Создайте свой файл помощников (или другого пользовательского класса) и предоставьте ему соответствующее пространство имен. Напишите свой класс и метод:
<?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
Это то, что предлагается JeffreyWay
в этом Обсуждение Laracasts.
app/Http
каталог, создать helpers.php
файл и добавить свои функции.composer.json
, в autoload
блок, добавить "files": ["app/Http/helpers.php"]
,composer dump-autoload
,Просеяв множество ответов о 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>
Да, есть другой способ сделать это!
Шаг 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, легкий путь
Это мой файл 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.
Готово!
Я больше не использую эту опцию, в настоящее время я использую Composer для загрузки статических файлов, таких как помощники.
Вы можете добавить помощников непосредственно по адресу:
...
"autoload": {
"files": [
"app/helpers/my_helper.php",
...
]
},
...
Для пользовательских библиотек помощников в моем проекте Laravel я создал папку с именем Libraries
в моем Laravel/App
В каталоге и в каталоге библиотек я создал различные файлы для разных вспомогательных библиотек.
После создания моих вспомогательных файлов я просто включаю все эти файлы в свой composer.json файл как это
...
"autoload": {
"classmap": [
"database"],
"files": [
"app/Libraries/commonFunctions.php"],
"psr-4": {
"App\\": "app/"}
},
...
и выполнить
composer dumpautoload