Если бы я хотел сделать currentUser()
функция для некоторых вещей, которые я делаю, где я могу использовать его в представлении или в контроллере (например, рельсы, где вы делаете helper_method: current_user
в контроллере приложения).
Все, что я прочитал, говорит о том, что создается папка помощников и тут же добавляется функция. Helpers::functionName
Это правильный способ сделать это?
Каков «общий путь» создания вспомогательных функций, которые можно использовать в шаблонах и контроллерах blade-серверов?
Создайте новый файл в вашем приложении / каталоге помощников, назовите его 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',
Еще один эффективный способ создания файла глобальных функций — это его автозагрузка прямо из композитора. Раздел автозагрузки 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"]
},
composer dump-autoload
Поздравляем! Теперь вы можете получить доступ global_function_example('hello world')
сформировать любую часть вашего приложения, включая Blade Views.
Надеюсь это кому-нибудь пригодится!
Часто вы обнаружите, что нуждаетесь в утилитарной функции, которая доступна глобально во всем приложении. В зависимости от того, как laravel пишет своих помощников по умолчанию, вы можете расширить возможности с помощью своих пользовательских функций.
Я предпочитаю вам файл, а не класс, так как я не хочу беспокоиться о пространствах имен и хочу, чтобы его функции были доступны без префиксов классов, таких как: greeting('Brian');
вместо Helper::greeting('Brian');
так же, как Ларавел делает со своими помощниками.
Файл: app/Support/helper.php
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 в методе загрузки 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