1. Code
  2. PHP
  3. Laravel

Как создать хелпер в Laravel

Прежде всего, я бы предпочел, чтобы лучше на официальном сайте Laravel рассказывалось о хелперах.
Scroll to top

Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)

Прежде всего, я бы предпочел, чтобы лучше на официальном сайте Laravel рассказывалось о хелперах.

Laravel включает в себя множество глобальных «вспомогательных» функций PHP. Многие из этих функций используются самим фреймворком; Однако вы можете использовать их в своих приложениях, если сочтете их удобными.

Итак, в основном, хелперы в Laravel - это встроенные служебные функции, которые вы можете вызывать из любого места вашего приложения. Если бы они не были предоставлены самим фреймворков, вы, возможно, в итоге сами бы создали собственные вспомогательные классы.

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

Хелперы в Ларавеле

Как мы обсуждали ранее, в основе структуры Laravel имеется множество хелперов. Они группируются в зависимости от функциональности, которую они предоставляют. Вот список вспомогательных групп.

Массивы

Хелперы из этой группы предоставляют функциональные возможности для манипулирования элементами массива. Чаще всего вы находитесь в ситуации, когда вы хотите выполнять разные операции над элементами массива. Таким образом, это место, где вы должны сначала посмотреть, есть ли то, что вы ищете, уже существует.

Пути к папкам и файлам

Я считаю, что хелперы из этой категории наиболее полезные. Они возвращают полностью квалифицированный путь из разных каталогов, таких как app, storage, config и т.п. Бьюсь об заклад, вы уже используете большинство этих хелперов в своем приложении Laravel.

Строки

Обработка строк - это нечто неизбежное в вашей повседневной разработке приложений. Хотя существует множество функций манипуляции строками, предоставляемых самим PHP, в этой группе вы найдете еще несколько полезных.

URL-адрес

В этой категории хелперов очень мало, но они используются во всем приложении. В основном они используются для создания URL-адресов маршрутов, ресурсов и форм.

Разное

Эта категория содержит хелперы, которые предоставляют множество функций: от регистрации до отладки и многие другие.

Для полной справки по хелперам Laravel нет лучшего места, чем официальная документация.

Создайте свой первый пользовательский хелпер

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

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

Я предполагаю, что у вас есть таблица пользователей в вашей базе данных, и у нее есть как минимум два поля: userid и username.

Скелет хелпера Laravel

Прежде чем двигаться вперед и фактически создавать файлы, давайте быстро рассмотрим файлы, которые мы собираемся создать в остальной части статьи.

  • App/Helpers/Envato/User.php: Это наш вспомогательный файл, который содержит логику нашего хелпера.
  • App/Providers/EnvatoServiceProvider.php: это настраиваемый файл поставщика услуг, который загружает наш пользовательский вспомогательный файл.
  • config/app.php: В этом файле мы объявим нашего специализированного поставщика услуг, а также здесь мы  определим псевдоним для нашего хелпера, чтобы нам не пришлось  нашего помощника.
  • routes/web.php: довольно стандартный файл маршрута Laravel, где мы будем тестировать нашего хелпера.

Создание файлов хелпера

Хотя вы можете размещать свои вспомогательные файлы в любом месте приложения, более интуитивно понятный и стандартный способ предполагает, что файлы должны находиться под вашим каталогом app.

Итак, двигаемся дальше, создайте каталог Helpers/Envato в директории app и создайте файл User.php со следующим содержимым. Конечно, вы можете разместить его непосредственно в каталоге app или app/Helpers, но дополнительный уровень вложенности позволяет нам удобно организовать наших хелперов, особенно когда у вас их будет много.

1
<?php
2
//app/Helpers/Envato/User.php

3
namespace App\Helpers\Envato;
4
5
use Illuminate\Support\Facades\DB;
6
7
class User {
8
    /**

9
     * @param int $user_id User-id

10
     * 

11
     * @return string

12
     */
13
    public static function get_username($user_id) {
14
        $user = DB::table('users')->where('userid', $user_id)->first();
15
        
16
        return (isset($user->username) ? $user->username : '');
17
    }
18
}

Файл начинается с довольно стандартного объявления пространства имен:

1
namespace App\Helpers\Envato;

Цель нашего пользовательского хелпера - получить имя пользователя на основе идентификатора пользователя. Следовательно, нам нужно взаимодействовать с базой данных, поэтому мы должны подключить DB Facade.

1
use Illuminate\Support\Facades\DB;

Для тех, кто не знаком с Laravel Facades, это просто еще один удобный способ доступа к объектам из контейнера. В качестве альтернативы вы могли бы использовать инъекцию зависимостей.

Далее у нас конкретная реализация нашего хелпера. Как вы можете видеть, существует статический метод, определяющий логику извлечения имени пользователя на основе идентификатора пользователя.

1
$user = DB::table('users')->where('userid', $user_id)->first();

Объект $user хранит запись базы данных с соответствующим идентификатором пользователя. Наконец, метод возвращает имя пользователя в качестве ответа в следующем выражении.

1
return (isset($user->username) ? $user->username : '');

Это касается нашего вспомогательного файла.

Теперь мы создали наш вспомогательный файл, но вопрос в том, как вы собираетесь его использовать? Мне приходят два быстрых решения:

  • Вы можете включить наше вспомогательное имя файла в composer.json, чтобы оно автоматически загружалось. Затем вы можете сразу вызвать статический метод нашего вспомогательного класса.
  • Вы можете продолжить и создать поставщика услуг Laravel, который позволит вам зарегистрировать свой собственный вспомогательный файл, чтобы среда Laravel загружала его вместе с другими зависимостями. Зарегистрируйте этого поставщика услуг в конфигурации Laravel и создайте псевдоним для использования вашего хелпера.

Конечно, первый из них довольно быстр и прост в реализации, и у вас может возникнуть соблазн сделать это, но я предпочел бы предложить последний, поскольку он выглядит более ремесленным способом и более удобен в обслуживании.

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

1
$php artisan make:provider EnvatoServiceProvider 
2
Provider created successfully.

Вы должны увидеть сообщение, подтверждающее, что поставщик успешно был создан в каталоге app/Providers.

Откройте этот файл, и вы уже должны увидеть два метода. Важным в контексте этой статьи является метод register. Да, на данный момент он пуст, так что надо будет немного потрудиться, чтобы сделать его более полезным.

1
public function register()
2
{
3
    require_once app_path() . '/Helpers/Envato/User.php';
4
}

Метод register используется для регистрации ваших зависимостей, и мы это точно сделали. Мы включили наш пользовательский вспомогательный файл.

Вот как должен выглядеть файл app/Providers/EnvatoServiceProvider.php после внесенных изменений.

1
<?php
2
// app/Providers/EnvatoServiceProvider.php

3
namespace App\Providers;
4
5
use Illuminate\Support\ServiceProvider;
6
7
class EnvatoServiceProvider extends ServiceProvider
8
{
9
    /**

10
     * Bootstrap the application services.

11
     *

12
     * @return void

13
     */
14
    public function boot()
15
    {
16
        //

17
    }
18
19
    /**

20
     * Register the application services.

21
     *

22
     * @return void

23
     */
24
    public function register()
25
    {
26
        require_once app_path() . '/Helpers/Envato/User.php';
27
    }
28
}

Так что пока все хорошо. У нас есть наш пользовательский хелпер и поставщик услуг для него.

Затем нам нужно сообщить Laravel о нашем поставщике услуг, чтобы он мог загрузить его во время начальной загрузки. Давайте откроем файл config/app.php и добавим следующую запись в массив providers в конце.

1
App\Providers\EnvatoServiceProvider::class,

Чтобы использовать наш хелпер удобным способом, мы могли бы создать псевдоним. Итак, давайте сделаем это, добавив следующую запись в массив aliases в конце в том же файле.

1
'EnvatoUser' => App\Helpers\Envato\User::class,

Определив эту запись, мы можем вызвать наш хелпер, используя ключевое слово EnvatoUser. Довольно удобно, не правда ли? Для справки, вот полный файл config/app.php.

1
<?php
2
// config/app.php

3
return [
4
5
    /*

6
    |--------------------------------------------------------------------------

7
    | Application Name

8
    |--------------------------------------------------------------------------

9
    |

10
    | This value is the name of your application. This value is used when the

11
    | framework needs to place the application's name in a notification or

12
    | any other location as required by the application or its packages.

13
    */
14
15
    'name' => 'Laravel',
16
17
    /*

18
    |--------------------------------------------------------------------------

19
    | Application Environment

20
    |--------------------------------------------------------------------------

21
    |

22
    | This value determines the "environment" your application is currently

23
    | running in. This may determine how you prefer to configure various

24
    | services your application utilizes. Set this in your ".env" file.

25
    |

26
    */
27
28
    'env' => env('APP_ENV', 'production'),
29
30
    /*

31
    |--------------------------------------------------------------------------

32
    | Application Debug Mode

33
    |--------------------------------------------------------------------------

34
    |

35
    | When your application is in debug mode, detailed error messages with

36
    | stack traces will be shown on every error that occurs within your

37
    | application. If disabled, a simple generic error page is shown.

38
    |

39
    */
40
41
    'debug' => env('APP_DEBUG', false),
42
43
    /*

44
    |--------------------------------------------------------------------------

45
    | Application URL

46
    |--------------------------------------------------------------------------

47
    |

48
    | This URL is used by the console to properly generate URLs when using

49
    | the Artisan command line tool. You should set this to the root of

50
    | your application so that it is used when running Artisan tasks.

51
    |

52
    */
53
54
    'url' => env('APP_URL', 'https://localhost'),
55
56
    /*

57
    |--------------------------------------------------------------------------

58
    | Application Timezone

59
    |--------------------------------------------------------------------------

60
    |

61
    | Here you may specify the default timezone for your application, which

62
    | will be used by the PHP date and date-time functions. We have gone

63
    | ahead and set this to a sensible default for you out of the box.

64
    |

65
    */
66
67
    'timezone' => 'UTC',
68
69
    /*

70
    |--------------------------------------------------------------------------

71
    | Application Locale Configuration

72
    |--------------------------------------------------------------------------

73
    |

74
    | The application locale determines the default locale that will be used

75
    | by the translation service provider. You are free to set this value

76
    | to any of the locales which will be supported by the application.

77
    |

78
    */
79
80
    'locale' => 'en',
81
82
    /*

83
    |--------------------------------------------------------------------------

84
    | Application Fallback Locale

85
    |--------------------------------------------------------------------------

86
    |

87
    | The fallback locale determines the locale to use when the current one

88
    | is not available. You may change the value to correspond to any of

89
    | the language folders that are provided through your application.

90
    |

91
    */
92
93
    'fallback_locale' => 'en',
94
95
    /*

96
    |--------------------------------------------------------------------------

97
    | Encryption Key

98
    |--------------------------------------------------------------------------

99
    |

100
    | This key is used by the Illuminate encrypter service and should be set

101
    | to a random, 32 character string, otherwise these encrypted strings

102
    | will not be safe. Please do this before deploying an application!

103
    |

104
    */
105
106
    'key' => env('APP_KEY'),
107
108
    'cipher' => 'AES-256-CBC',
109
110
    /*

111
    |--------------------------------------------------------------------------

112
    | Logging Configuration

113
    |--------------------------------------------------------------------------

114
    |

115
    | Here you may configure the log settings for your application. Out of

116
    | the box, Laravel uses the Monolog PHP logging library. This gives

117
    | you a variety of powerful log handlers / formatters to utilize.

118
    |

119
    | Available Settings: "single", "daily", "syslog", "errorlog"

120
    |

121
    */
122
123
    'log' => env('APP_LOG', 'single'),
124
125
    'log_level' => env('APP_LOG_LEVEL', 'debug'),
126
127
    /*

128
    |--------------------------------------------------------------------------

129
    | Autoloaded Service Providers

130
    |--------------------------------------------------------------------------

131
    |

132
    | The service providers listed here will be automatically loaded on the

133
    | request to your application. Feel free to add your own services to

134
    | this array to grant expanded functionality to your applications.

135
    |

136
    */
137
138
    'providers' => [
139
140
        /*

141
         * Laravel Framework Service Providers...

142
         */
143
        Illuminate\Auth\AuthServiceProvider::class,
144
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
145
        Illuminate\Bus\BusServiceProvider::class,
146
        Illuminate\Cache\CacheServiceProvider::class,
147
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
148
        Illuminate\Cookie\CookieServiceProvider::class,
149
        Illuminate\Database\DatabaseServiceProvider::class,
150
        Illuminate\Encryption\EncryptionServiceProvider::class,
151
        Illuminate\Filesystem\FilesystemServiceProvider::class,
152
        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
153
        Illuminate\Hashing\HashServiceProvider::class,
154
        Illuminate\Mail\MailServiceProvider::class,
155
        Illuminate\Notifications\NotificationServiceProvider::class,
156
        Illuminate\Pagination\PaginationServiceProvider::class,
157
        Illuminate\Pipeline\PipelineServiceProvider::class,
158
        Illuminate\Queue\QueueServiceProvider::class,
159
        Illuminate\Redis\RedisServiceProvider::class,
160
        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
161
        Illuminate\Session\SessionServiceProvider::class,
162
        Illuminate\Translation\TranslationServiceProvider::class,
163
        Illuminate\Validation\ValidationServiceProvider::class,
164
        Illuminate\View\ViewServiceProvider::class,
165
166
        /*

167
         * Package Service Providers...

168
         */
169
        Laravel\Tinker\TinkerServiceProvider::class,
170
171
        /*

172
         * Application Service Providers...

173
         */
174
        App\Providers\AppServiceProvider::class,
175
        App\Providers\AuthServiceProvider::class,
176
        // App\Providers\BroadcastServiceProvider::class,

177
        App\Providers\EventServiceProvider::class,
178
        App\Providers\RouteServiceProvider::class,
179
        App\Providers\EnvatoServiceProvider::class,
180
    ],
181
182
    /*

183
    |--------------------------------------------------------------------------

184
    | Class Aliases

185
    |--------------------------------------------------------------------------

186
    |

187
    | This array of class aliases will be registered when this application

188
    | is started. However, feel free to register as many as you wish as

189
    | the aliases are "lazy" loaded so they don't hinder performance.

190
    |

191
    */
192
193
    'aliases' => [
194
195
        'App' => Illuminate\Support\Facades\App::class,
196
        'Artisan' => Illuminate\Support\Facades\Artisan::class,
197
        'Auth' => Illuminate\Support\Facades\Auth::class,
198
        'Blade' => Illuminate\Support\Facades\Blade::class,
199
        'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
200
        'Bus' => Illuminate\Support\Facades\Bus::class,
201
        'Cache' => Illuminate\Support\Facades\Cache::class,
202
        'Config' => Illuminate\Support\Facades\Config::class,
203
        'Cookie' => Illuminate\Support\Facades\Cookie::class,
204
        'Crypt' => Illuminate\Support\Facades\Crypt::class,
205
        'DB' => Illuminate\Support\Facades\DB::class,
206
        'Eloquent' => Illuminate\Database\Eloquent\Model::class,
207
        'Event' => Illuminate\Support\Facades\Event::class,
208
        'File' => Illuminate\Support\Facades\File::class,
209
        'Gate' => Illuminate\Support\Facades\Gate::class,
210
        'Hash' => Illuminate\Support\Facades\Hash::class,
211
        'Lang' => Illuminate\Support\Facades\Lang::class,
212
        'Log' => Illuminate\Support\Facades\Log::class,
213
        'Mail' => Illuminate\Support\Facades\Mail::class,
214
        'Notification' => Illuminate\Support\Facades\Notification::class,
215
        'Password' => Illuminate\Support\Facades\Password::class,
216
        'Queue' => Illuminate\Support\Facades\Queue::class,
217
        'Redirect' => Illuminate\Support\Facades\Redirect::class,
218
        'Redis' => Illuminate\Support\Facades\Redis::class,
219
        'Request' => Illuminate\Support\Facades\Request::class,
220
        'Response' => Illuminate\Support\Facades\Response::class,
221
        'Route' => Illuminate\Support\Facades\Route::class,
222
        'Schema' => Illuminate\Support\Facades\Schema::class,
223
        'Session' => Illuminate\Support\Facades\Session::class,
224
        'Storage' => Illuminate\Support\Facades\Storage::class,
225
        'URL' => Illuminate\Support\Facades\URL::class,
226
        'Validator' => Illuminate\Support\Facades\Validator::class,
227
        'View' => Illuminate\Support\Facades\View::class,
228
        'EnvatoUser' => App\Helpers\Envato\User::class,
229
    ],
230
231
];

Мы почти сделали это! Мы сделали всю тяжелую работу, чтобы добраться до этого места, и теперь мы можем воспользоваться преимуществами нашего специального хелпера.

Ваш первый пользовательский хелпер в действии

Опять же, чтобы все было просто и понятно, мы определим базовый маршрут Laravel и вызовем наш хелпер!

Идем дальше и создаем файл route/web.php со следующим содержимым.

1
<?php
2
// routes/web.php

3
/*

4
|--------------------------------------------------------------------------

5
| Web Routes

6
|--------------------------------------------------------------------------

7
|

8
| Here is where you can register web routes for your application. These

9
| routes are loaded by the RouteServiceProvider within a group which

10
| contains the "web" middleware group. Now create something great!

11
|

12
*/
13
14
Route::get('/envato-user-helper-demo', function () {
15
    return EnvatoUser::get_username(1);
16
});

Это вообще нуждается в объяснении? Мы только что вызвали пользовательский помощник по сокращению EnvatoUser::get_username, и он должен вернуть имя пользователя.

Конечно, вы можете вызвать наш хелпер из любой точки приложения, будь то контроллер или представление.

На этом наша история заканчивается сегодня.

Вывод

Хелперы в Laravel - действительно мощная функция, и я уверен, что в качестве разработчика вы бы хотели дальше развить эту тему. И это была тема сегодняшнего дня - мы рассмотрели основы файловой структуры хелпера Laravel и создали полезный пользовательский хелпер.

Надеюсь, вам понравилась статья, и она поможет вам создавать собственные пользовательские хелперы в повседневной разработке приложений Laravel.

Не стесняйтесь оставлять свои комментарии и запросы в ленте ниже. Я также комментирую мой Twitter и отвечаю на них, как только могу!