Статьи

Как создать помощника Laravel

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<?php
//app/Helpers/Envato/User.php
namespace App\Helpers\Envato;
 
use Illuminate\Support\Facades\DB;
 
class User {
    /**
     * @param int $user_id User-id
     *
     * @return string
     */
    public static function get_username($user_id) {
        $user = DB::table(‘users’)->where(‘userid’, $user_id)->first();
         
        return (isset($user->username) ? $user->username : »);
    }
}

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

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
2
$php artisan make:provider EnvatoServiceProvider
Provider created successfully.

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

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

1
2
3
4
public function register()
{
    require_once app_path() .
}

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
// app/Providers/EnvatoServiceProvider.php
namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
 
class EnvatoServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
 
    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        require_once app_path() .
    }
}

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

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

1
App\Providers\EnvatoServiceProvider::class,

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

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

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

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
<?php
// config/app.php
return [
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    */
 
    ‘name’ => ‘Laravel’,
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘env’ => env(‘APP_ENV’, ‘production’),
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘debug’ => env(‘APP_DEBUG’, false),
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘url’ => env(‘APP_URL’, ‘https://localhost’),
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘timezone’ => ‘UTC’,
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘locale’ => ‘en’,
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘fallback_locale’ => ‘en’,
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘key’ => env(‘APP_KEY’),
 
    ‘cipher’ => ‘AES-256-CBC’,
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    |
    |
    */
 
    ‘log’ => env(‘APP_LOG’, ‘single’),
 
    ‘log_level’ => env(‘APP_LOG_LEVEL’, ‘debug’),
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘providers’ => [
 
        /*
         * Laravel Framework Service Providers…
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        Illuminate\Database\DatabaseServiceProvider::class,
        Illuminate\Encryption\EncryptionServiceProvider::class,
        Illuminate\Filesystem\FilesystemServiceProvider::class,
        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
        Illuminate\Hashing\HashServiceProvider::class,
        Illuminate\Mail\MailServiceProvider::class,
        Illuminate\Notifications\NotificationServiceProvider::class,
        Illuminate\Pagination\PaginationServiceProvider::class,
        Illuminate\Pipeline\PipelineServiceProvider::class,
        Illuminate\Queue\QueueServiceProvider::class,
        Illuminate\Redis\RedisServiceProvider::class,
        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
        Illuminate\Session\SessionServiceProvider::class,
        Illuminate\Translation\TranslationServiceProvider::class,
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,
 
        /*
         * Package Service Providers…
         */
        Laravel\Tinker\TinkerServiceProvider::class,
 
        /*
         * Application Service Providers…
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
        App\Providers\EnvatoServiceProvider::class,
    ],
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘aliases’ => [
 
        ‘App’ => Illuminate\Support\Facades\App::class,
        ‘Artisan’ => Illuminate\Support\Facades\Artisan::class,
        ‘Auth’ => Illuminate\Support\Facades\Auth::class,
        ‘Blade’ => Illuminate\Support\Facades\Blade::class,
        ‘Broadcast’ => Illuminate\Support\Facades\Broadcast::class,
        ‘Bus’ => Illuminate\Support\Facades\Bus::class,
        ‘Cache’ => Illuminate\Support\Facades\Cache::class,
        ‘Config’ => Illuminate\Support\Facades\Config::class,
        ‘Cookie’ => Illuminate\Support\Facades\Cookie::class,
        ‘Crypt’ => Illuminate\Support\Facades\Crypt::class,
        ‘DB’ => Illuminate\Support\Facades\DB::class,
        ‘Eloquent’ => Illuminate\Database\Eloquent\Model::class,
        ‘Event’ => Illuminate\Support\Facades\Event::class,
        ‘File’ => Illuminate\Support\Facades\File::class,
        ‘Gate’ => Illuminate\Support\Facades\Gate::class,
        ‘Hash’ => Illuminate\Support\Facades\Hash::class,
        ‘Lang’ => Illuminate\Support\Facades\Lang::class,
        ‘Log’ => Illuminate\Support\Facades\Log::class,
        ‘Mail’ => Illuminate\Support\Facades\Mail::class,
        ‘Notification’ => Illuminate\Support\Facades\Notification::class,
        ‘Password’ => Illuminate\Support\Facades\Password::class,
        ‘Queue’ => Illuminate\Support\Facades\Queue::class,
        ‘Redirect’ => Illuminate\Support\Facades\Redirect::class,
        ‘Redis’ => Illuminate\Support\Facades\Redis::class,
        ‘Request’ => Illuminate\Support\Facades\Request::class,
        ‘Response’ => Illuminate\Support\Facades\Response::class,
        ‘Route’ => Illuminate\Support\Facades\Route::class,
        ‘Schema’ => Illuminate\Support\Facades\Schema::class,
        ‘Session’ => Illuminate\Support\Facades\Session::class,
        ‘Storage’ => Illuminate\Support\Facades\Storage::class,
        ‘URL’ => Illuminate\Support\Facades\URL::class,
        ‘Validator’ => Illuminate\Support\Facades\Validator::class,
        ‘View’ => Illuminate\Support\Facades\View::class,
        ‘EnvatoUser’ => App\Helpers\Envato\User::class,
    ],
 
];

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<?php
// routes/web.php
/*
|—————————————————————————
|
|—————————————————————————
|
|
|
|
|
*/
 
Route::get(‘/envato-user-helper-demo’, function () {
    return EnvatoUser::get_username(1);
});

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

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

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

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

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

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