Рекомендации для помощников и базовых функций Laravel 4?

152

Я пытаюсь понять, как лучше всего поместить глобальную функцию в Laravel 4. Например, форматирование даты. Я не думаю, что делать фасад стоит, так как фасады слишком модульные. Я читал статьи о создании папки библиотеки и хранении там классов, но для простой функции это, похоже, слишком много. Разве такой «инструмент» не должен быть доступен в шаблонах Blade?

Каковы лучшие практики для чего-то подобного и как мне сделать это доступным для шаблонов Blade?

Джейсон Спик
источник

Ответы:

233

Уродливый, ленивый и ужасный способ: в конце bootstrap/start.phpдобавьте include('tools.php')и поместите свою функцию в этот новый файл.

Чистый способ: создать библиотеку. Таким образом, он будет загружен ТОЛЬКО при его использовании.

  • Создайте librariesпапку внутри вашей appпапки
  • Создайте свой библиотечный файл, создайте в нем класс и добавьте к нему статические функции.
  • Вариант 1 : Изменить, start/global.phpчтобы добавить app_path().'/libraries'в ClassLoader::addDirectories( массив.
  • Вариант 2 : Изменить, composer.jsonчтобы добавить "app/libraries"в autoloadмассив. Бегатьcomposer dump-autoload
  • Вызовите ваш класс и статические функции из ваших представлений.

О ваших опциях, указанных в global.phpфайле

В дополнение к использованию Composer, вы можете использовать загрузчик классов Laravel для загрузки ваших контроллеров и моделей. Это полезно для хранения всех ваших классов в «глобальном» пространстве имен без обновления Composer.

Вы можете комбинировать оба варианта, когда загрузчик классов Laravel будет автоматически искать классы в зарегистрированных каталогах ( вариант 1 , проще), а Composer будет вести учет всех классов, но только после его обновления ( вариант 2 , может повысить производительность).

Александр дано
источник
3
Я думаю, что вы также должны поместить app_path().'/library'в start / global.php.
Александр Бутинский
2
@AlexandreButynski Хороший вопрос. Это позволит добавлять библиотеки без необходимости каждый раз обновлять композитор. Я отредактировал свой пост, чтобы добавить это.
Александр Дано
Поэтому я создаю класс с именем IDK ... SiteHelpers, а затем определяю метод formatDate. и тогда в шаблоне я должен быть в состоянии сделать SiteHelpers :: formatDate ($ date)?
Джейсон Спик
@JasonSpick Да, и убедитесь, что вы называете свой файлsitehelpers.php
Александр Дано
3
Зачем вам нужно добавлять его в автозагрузку композитора, а также в файл global.php?
CashIsClay
82

Мой способ сделать это - создать новую папку в /appкаталоге в корне вашего проекта Laravel 4. Затем добавьте эту папку в первый массив /app/start/global.phpфайла следующим образом:

<?php

ClassLoader::addDirectories(array(

app_path().'/commands',
app_path().'/controllers',
app_path().'/models',
app_path().'/database/seeds',
app_path().'/classes', // This line is the one I've added.

));

Пока структура папок в новой /app/classesпапке соответствует вашему соглашению о пространстве имен. Laravel 4 автоматически загрузит все классы / файлы в этой папке. Таким образом, нет необходимости копаться в каких-либо файлах композитора или запускать команду композитора.

Не уверен, что это лучшая практика, но она, безусловно, работает.

Если вы создали простой файл с именем, /app/classes/Helpers/Helper.phpподобным этому:

<?php namespace Helpers;

class Helper {

    public static function helloWorld()
    {
        return 'Hello World';
    }
}

Все, что вам нужно сделать, это позвонить Helpers\Helper::helloWorld();

Вы также можете использовать псевдоним этого вспомогательного класса в своем /app/config/app.phpфайле. Просто добавьте что-то вроде этого в конец aliasesмассива:

'Helper'          => 'Helpers\Helper'
JasonMortonNZ
источник
4
Мне нравится этот способ, потому что вам не нужно смешивать что-либо с композитором, чистое и классное решение. +1
Гадома
3
Если бы вы добавили свой вспомогательный класс в файл app.php, теперь вы можете получить доступ к классу напрямую, как это: Helper :: hellowWorld ();
Хельмут Гранда
должен ли помощник быть классом? я могу определить простую функцию здесь?
Вебинан
2
Это не работает, если вы не редактируете composer.json и не запускаете dumpautoload для композитора
Rommy
1
Отличное решение. Как говорит Ромми, не забывай бегать composer dump-autoload- я и потратил 20 минут, почесывая голову.
al_manchester
25

Метод helpers.php от Laravel заключается в добавлении его в ваши «файлы» в файле composer.json ( https://github.com/laravel/framework/blob/master/composer.json ):

"autoload": {
    "classmap": [
        ...
    ],
    "files": [
        "app/libraries/helpers.php"
    ],
},

Что я делаю, так это создаю маленькие классы (несколько методов на класс, по одной строке на метод, все расширяется от чего-то и DRY, это моя цель),

class ExtendedCarbon extends Carbon\Carbon {

    public function formatDDMMAAAA($date)
    {
        /// format and return
    }

}

сохраните их в app / библиотеки и добавьте в composer.json:

"autoload": {
    "classmap": [
        ...
        "app/libraries",
        ...
    ],
},

казнить

composer dump

А потом просто используйте их там, где вам нужно

$formatted = (new ExtendedCarbon)->formatDDMMAAAA($date);

Посмотрите это видео о рефакторинге: http://www.youtube.com/watch?v=DC-pQPq0acs

Кстати, я уверен, что это всего лишь пример, но вам может не понадобиться помощник для форматирования дат, поскольку все даты в Laravel являются экземплярами Carbon ( https://github.com/briannesbitt/Carbon ) и он имеет множество методов для форматирования даты и времени.

Антонио Карлос Рибейро
источник
Я сам не большой поклонник статических методов и стараюсь использовать методы экземпляра, когда это необходимо. Ошибка Я вполне уверен, что в случае такого использования, вам будет гораздо лучше иметь formatDDMMAAAA()как static.
XedinUnknown
7

Вы также можете использовать View::share()вместе с замыканиями для достижения этой цели - я только что написал об этом: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

Дополнительное преимущество: вам не нужно создавать дополнительный класс, а также поддерживать чистоту глобального пространства имен.

Franz
источник
Мне нравится этот подход. Больше рельсов. Можем ли мы как-нибудь добавить все методы view-helper в черту и сделать их доступными в виде лезвия?
bibstha
Я не думаю, что это возможно с PHP, если честно.
Франц