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 и отвечаю на них, как только могу!



