Как сделать глобальные вспомогательные функции в laravel 5?
Если бы я хотел сделать функцию currentUser()
для некоторого материала oauth, я делаю, где я могу использовать его в представлении или в контроллере (подумайте о рельсах, где вы делаете helper_method: current_user
в контроллере приложения).
Все, что я читаю, означает создание папки помощников и добавление функции там, а затем таким образом, вы можете сделать Helpers::functionName
Правильно ли это сделать?
Что такое "способ laravel" для создания вспомогательных функций, которые могут использоваться в шаблонах и контроллерах blade-серверов?
Ответы
Ответ 1
Создайте новый файл в каталоге вашего приложения/справочника it it AnythingHelper.php
Пример моего помощника:
<?php
function getDomesticCities()
{
$result = \App\Package::where('type', '=', 'domestic')
->groupBy('from_city')
->get(['from_city']);
return $result;
}
создайте поставщика услуг для вашего помощника, выполнив команду
php artisan make:provider HelperServiceProvider
в регистровой функции вашего нового созданного HelperServiceProvider.php добавьте следующий код
require_once app_path('Helpers/AnythingHelper.php');
теперь в вашем config/app.php загрузите этого поставщика услуг, и вы закончили
'App\Providers\HelperServiceProvider',
Ответ 2
Простой и эффективный способ создания файла глобальных функций - это его автозагрузка прямо из Composer. Секция автозагрузки composer принимает массив files
который загружается автоматически.
-
Создайте файл functions.php
где угодно. В этом примере мы собираемся создать внутри app/Helpers
.
-
Добавьте свои функции, но не добавляйте класс или пространство имен.
<?php
function global_function_example($str)
{
return 'A Global Function with '. $str;
}
-
В composer.json
внутри раздела autoload
добавьте следующую строку:
"files": ["app/Helpers/functions.php"]
Пример для Laravel 5:
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
},
"files": ["app/Helpers/functions.php"] // <-- Add this line
},
-
Запустите composer dump-autoload
Готово! Теперь вы можете получить доступ к global_function_example('hello world')
из любой части вашего приложения, включая представления Blade.
Ответ 3
Laravel глобальные помощники
Часто вы обнаружите, что нуждаетесь в служебной функции, которая доступна глобально во всем приложении. В зависимости от того, как laravel пишет своих помощников по умолчанию, вы можете расширить возможности с помощью своих пользовательских функций.
Создайте вспомогательный файл, а не класс
Я предпочитаю вам файл, а не класс, поскольку я не хочу беспокоиться о пространствах имен и хочу, чтобы его функции были доступны без префиксов классов, таких как: greeting('Brian');
вместо Helper::greeting('Brian');
так же, как Ларавел делает со своими помощниками.
Файл: app/Support/helper.php
Зарегистрируйте вспомогательный файл в Composer: composer.json
{
...
"autoload": {
"classmap": [
"database"
],
"files": [
"app/Support/helpers.php"
],
"psr-4": {
"App\\": "app/"
}
},
...
}
Создайте свою первую вспомогательную функцию
<?php
if (!function_exists('greet')) {
/**
* Greeting a person
*
* @param string $person Name
* @return string
*/
function greet($person)
{
return 'Hello ' . $person;
}
}
Использование:
Не забудьте автоматически загрузить файл, прежде чем пытаться получить доступ к его функциям: composer dump-autoload
Давай тест с тинкером
$ php artisan tinker
Psy Shell v0.8.17 (PHP 7.0.6 ΓÇö cli) by Justin Hileman
>>> greet('Brian');
=> "Hello Brian"
>>> exit
Exit: Goodbye.
С лезвием
<p>{{ greet('Brian') }}</p>
Расширенное использование в качестве директивы Blade:
Временами вы захотите использовать директиву blade вместо простой функции. Зарегистрируйте директиву Blade в методе загрузки AppServiceProvider: app/Providers/AppServiceProvider.php
public function boot()
{
// ...
Blade::directive('greet', function ($expression) {
return "<?php echo greet({$expression}); ?>";
});
}
Использование: <p>@greet('Brian')</p>
Примечание: вам может потребоваться очистить кеш-представления php artisan view:clear
Ответ 4
Приведенные выше ответы хороши с небольшим усложнением, поэтому этот ответ существует.
utils.php
if (!function_exists('printHello')) {
function printHello()
{
return "Hello world!";
}
}
в app/Providers/AppServiceProvider.php добавьте следующее в зарегистрируйте метод
public function register()
{
require_once __DIR__ . "/path/to/utils.php"
}
теперь функция printHello доступна в любом месте кодовой базы, как и любые другие глобальные функции laravel.