Итак, я пытаюсь понять лучшее место для размещения глобальной функции в laravel 4. Например: форматирование даты. Я не думаю, что сделать фасад стоит того, фасады слишком модульные. Я читал статьи о создании папки библиотеки и хранении там классов, но это также очень похоже на простую функцию. Кроме того, не должен ли такой инструмент быть доступен в шаблонах клинков?
Каковы лучшие практики для чего-то подобного? И как сделать его доступным для шаблонов клинков?
Уродливый, ленивый и ужасный способ: в конце bootstrap/start.php
добавьте include('tools.php')
и поместите свою функцию в этот новый файл.
Чистый способ: создать библиотеку. Таким образом, он будет автоматически загружаться, когда вы его используете.
libraries
внутри папки app
start/global.php
, чтобы добавить app_path().'/libraries'
в массив ClassLoader::addDirectories(
.composer.json
, чтобы добавить "app/libraries"
в массив autoload
. Запустите composer dump-autoload
О ваших параметрах, указанных в файле global.php
В дополнение к использованию Composer вы можете использовать загрузчик классов Laravel для загрузите контроллеры и модели. Это полезно для сохранения всех ваши классы в "глобальном" пространстве имен без обновления Composer.
Вы можете комбинировать обе опции, где загрузчик классов Laravel будет автоматически искать классы в зарегистрированных каталогах (вариант 1, проще), а композитор будет вести запись обо всех классах, но только после его обновления (вариант 2 может улучшить производительность).
Мой способ сделать это - создать новую папку в каталоге /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'
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), и он имеет множество методов для форматирования даты и времени.
formatDDMMAAAA()
как static
.
Вы также можете использовать View::share()
вместе с закрытием для этого - я просто разместил об этом: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/
Добавленное преимущество: вам не нужно создавать дополнительный класс, а также содержать глобальное пространство имен в чистоте.
app_path().'/library'
/ Libraryapp_path().'/library'
в start / global.php.