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

133

Итак, я пытаюсь понять лучшее место для размещения глобальной функции в laravel 4. Например: форматирование даты. Я не думаю, что сделать фасад стоит того, фасады слишком модульные. Я читал статьи о создании папки библиотеки и хранении там классов, но это также очень похоже на простую функцию. Кроме того, не должен ли такой инструмент быть доступен в шаблонах клинков?

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

Теги:
laravel-4
blade

4 ответа

235
Лучший ответ

Уродливый, ленивый и ужасный способ: в конце 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, проще), а композитор будет вести запись обо всех классах, но только после его обновления (вариант 2 может улучшить производительность).

  • 3
    Я думаю, что вы также должны поместить app_path().'/library' / Library app_path().'/library' в start / global.php.
  • 2
    @AlexandreButynski Хороший вопрос. Это позволит добавлять библиотеки без необходимости каждый раз обновлять композитор. Я отредактировал свой пост, чтобы добавить это.
Показать ещё 5 комментариев
81

Мой способ сделать это - создать новую папку в каталоге /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'
  • 4
    Мне нравится этот способ, потому что вам не нужно смешивать что-либо с композитором, чистое и классное решение. +1
  • 3
    Если бы вы добавили свой вспомогательный класс в свой файл app.php, теперь вы можете получить к нему доступ напрямую, например так: Helper :: hellowWorld ();
Показать ещё 3 комментария
23

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

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

Я создаю небольшие классы (несколько методов для каждого класса, одна строка для каждого метода, все от чего-то и СУХОЕ, что моя цель),

class ExtendedCarbon extends Carbon\Carbon {

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

}

сохраните их в приложениях/библиотеках и добавьте в 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), и он имеет множество методов для форматирования даты и времени.

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню