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

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

view.blade.php

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

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

355

Решение

Создать 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"]
455

Другие решения

Моей первоначальной мыслью была также автозагрузка композитора, но она мне не очень понравилась. 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 / хелперы

287

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

Этот ответ применим к генеральный пользовательские классы в 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

285

Это то, что предлагается JeffreyWay в этом Обсуждение Laracasts.

  1. В вашем app/Http каталог, создать helpers.php файл и добавить свои функции.
  2. В composer.json, в autoload блок, добавить "files": ["app/Http/helpers.php"],
  3. Бежать composer dump-autoload,
70

Просеяв множество ответов о 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>
48

Пользовательские директивы по лезвиям в Ларавел 5

Да, есть другой способ сделать это!

Шаг 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, легкий путь

27

Это мой файл 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",
...
]
},
...
20

Для пользовательских библиотек помощников в моем проекте Laravel я создал папку с именем Libraries в моем Laravel/App В каталоге и в каталоге библиотек я создал различные файлы для разных вспомогательных библиотек.

После создания моих вспомогательных файлов я просто включаю все эти файлы в свой composer.json файл как это

...
"autoload": {
"classmap": [
"database"],
"files": [
"app/Libraries/commonFunctions.php"],
"psr-4": {
"App\\": "app/"}
},
...

и выполнить

composer dumpautoload
10
По вопросам рекламы [email protected]