1. Code
  2. PHP
  3. Laravel

Cách Tạo Một Helper trong Laravel

Để bắt đầu, tôi muốn để cho trang web chính thức của Laravel nói về các helper (trợ giúp).
Scroll to top

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Để bắt đầu, tôi muốn để cho trang web chính thức của Laravel nói về các helper (trợ giúp).

Laravel bao gồm một loạt các hàm "helper" PHP toàn cục. Nhiều trong số các hàm này được sử dụng bởi chính framework; tuy nhiên, bạn có thể thoải mái sử dụng chúng trong các ứng dụng của riêng bạn nếu bạn thấy chúng thuận tiện.

Do đó, về cơ bản, helper trong Laravel là các hàm tiện ích được tích hợp sẵn mà bạn có thể gọi từ bất cứ nơi nào trong ứng dụng của bạn. Nếu chúng không được cung cấp bởi framework chính, thì bạn có thể phải phát triển các lớp helper của riêng bạn.

Mặc dù nhân Laravel cung cấp rất nhiều helper khác nhau, nhưng sẽ có lúc bạn cần helper riêng của mình và muốn phát triển nó, do đó bạn sẽ không phải lặp lại code giống nhau ở đây và ở đó, từ đó giúp việc bảo trì được tốt hơn. Bạn sẽ học cách tạo một helper tuỳ biến cho Laravel trong hướng dẫn này.

Helper trong Laravel

Như chúng ta đã thảo luận trước đó, có rất nhiều helper sẵn có trong nhân của framework Laravel. Chúng được nhóm lại với nhau dựa trên tính năng mà chúng cung cấp. Dưới đây là danh sách các nhóm helper.

Mảng

Các helper trong nhóm này cung cấp các chức năng để thao tác lên các phần tử mảng. Thông thường, bạn ở trong tình huống nơi mà bạn muốn thực hiện các thao tác khác nhau trên các phần tử mảng. Vì vậy, đây là nơi bạn nên tìm kiếm đầu tiên để xem liệu những gì bạn đang tìm kiếm có tồn tại hay chưa.

Đường dẫn

Tôi thấy các helper trong danh mục này là hữu ích nhất. Chúng trả về đường dẫn đầy đủ của các thư mục khác nhau như app, storage, config, và tương tự. Tôi cá rằng bạn đang sử dụng hầu hết những helper đã có này trong ứng dụng Laravel của bạn.

Chuỗi

Thao tác lên chuỗi là điều không thể tránh khỏi trong phát triển ứng dụng hàng ngày của bạn. Mặc dù có rất nhiều hàm để thao tác chuỗi được cung cấp bởi chính PHP, nhưng bạn sẽ tìm thấy một vài hàm hữu ích trong phần này.

URL

Bạn sẽ tìm thấy rất ít hàm trong danh mục này, nhưng chúng được sử dụng xuyên suốt trong ứng dụng. Chúng được sử dụng để tạo ra các route, asset và URL action của form.

Hỗn hợp

Danh mục này chứa những helper cung cấp nhiều chức năng khác nhau, từ đăng nhập cho đến gỡ lỗi và vân vân.

Để tham khảo đầy đủ về helper trong Laravel, không có nơi nào tốt hơn là tài liệu hướng dẫn chính thức.

Tạo Helper Đầu tiên Của Bạn

Bây giờ bạn đã có một sự hiểu biết cơ bản về những helper trong Laravel và chúng được sử dụng cho mục đích gì. Trong phần này, tôi sẽ tiếp tục và minh hoạ cách làm thế nào để bạn có thể tạo ra helper tuỳ biến của riêng bạn để có thể được sử dụng trên toàn cục trong ứng dụng Laravel của bạn.

Để giữ cho mọi thứ được đơn giản và dễ hiểu, nó sẽ là một helper khá cơ bản, nhận một userid và trả về một username (tên người dùng) như là một phản hồi. Tất nhiên, điều đó không có vẻ là hữu ích lắm, nhưng tôi tin rằng nó đủ để minh hoạ khái niệm, và bạn luôn có thể mở rộng nó để đáp ứng các yêu cầu phức tạp của bạn.

Tôi giả sử rằng bạn có một bảng users trong cơ sở dữ liệu của bạn và nó có ít nhất hai trường—userid và username.

Bộ khung của Một Helper trong Laravel

Trước khi chúng ta bắt đầu và thật sự tạo các tập tin, hãy cùng xem xét các tập tin mà chúng ta sẽ tạo ra trong phần còn lại của bài viết.

  • app/Helpers/Envato/User.php: Đây là tập tin hỗ trợ của chúng ta chứa logic của helper.
  • app/Providers/EnvatoServiceProvider.php: Đây là tập tin service provider (cung cấp dịch vụ) tuỳ biến giúp nạp tập tin helper tùy biến của chúng ta.
  • config/app.php: Trong tập tin này, chúng ta sẽ khai báo service provider tuỳ biến của chúng ta và đồng thời giúp chúng ta xác định bí danh cho helper để chúng ta không phải sử dụng tên lớp đầy đủ của helper của chúng ta.
  • routes/web.php: Một tập tin route Laravel khá chuẩn, nơi chúng ta sẽ thật sự kiểm thử helper của chúng ta.

Tạo Các Tập tin Helper

Mặc dù bạn có thể đặt các tập tin helper của bạn ở bất kỳ nơi nào trong ứng dụng của bạn, nhưng cách trực quan và tiêu chuẩn hơn đó là nó nên nằm trong thư mục app của bạn.

Vì vậy hãy tiếp tục và tạo một thư mục Helpers/Envato trong app và tạo một tập tin User.php với các nội dung sau. Tất nhiên, bạn có thể đặt nó trực tiếp trong thư mục app hoặc app/Helpers, nhưng thêm cấp độ bổ sung cho phép chúng ta tổ chức các helper của chúng ta tốt hơn, đặc biệt là khi bạn có rất nhiều helper.

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
}

Tập tin bắt đầu bằng một khai báo không gian tên khá tiêu chuẩn:

1
namespace App\Helpers\Envato;

Mục đích của helper tuỳ biến của chúng ta là lấy về một username dựa trên một userid. Do đó, chúng ta cần phải tương tác với cơ sở dữ liệu, và điều đó buộc chúng ta phải bao gồm DB Facade.

1
use Illuminate\Support\Facades\DB;

Đối với những người không nắm vững về Facade trong Laravel, nó chỉ là một cách thuận tiện để truy xuất các đối tượng trong các service container. Ngoài ra, bạn có thể đã sử dụng dependency injection.

Tiếp tục, đến với cài đặt cụ thể cho helper của chúng ta. Như bạn thấy, có một phương thức tĩnh định nghĩa logic trong việc truy xuất một username dựa trên một userid.

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

Đối tượng $user nắm giữ bản ghi cơ sở dữ liệu với userid trùng khớp. Cuối cùng, phương thức trả về username dưới dạng một phản hồi trong câu lệnh sau.

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

Như vậy, tập tin helper của chúng ta gần như xong.

Bây giờ chúng ta đã tạo ra tập tin helper của chúng ta, nhưng câu hỏi đặt ra là bạn sẽ sử dụng nó như thế nào? Hai ý tưởng nhanh chóng ở trong đầu tôi:

  • Bạn có thể bao gồm tên tập tin helper của chúng ta trong composer.json, để nó được nạp tự động. Sau đó, bạn có thể gọi ngay phương thức tĩnh của lớp helper của chúng ta.
  • Bạn có thể tiếp tục và tạo một service provider trong Laravel cho phép bạn đăng ký tập tin helper tùy biến của bạn để framework Laravel tải nó cùng với các phụ thuộc khác. Hãy đăng ký service provider trong cấu hình Laravel và tạo một bí danh để sử dụng helper của bạn.

Tất nhiên, cái đầu tiên là khá nhanh và dễ dàng để thực hiện, và bạn có thể bị cám dỗ để làm như vậy, nhưng tôi muốn khuyên dùng cách thứ hai vì nó trông giống như một cách thủ công và có thể bảo trì tốt hơn.

Chuyển sang dòng lệnh và chạy lệnh sau đây trong thư mục gốc của ứng dụng của bạn để tạo ra một service provider mới.

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

Bạn sẽ thấy thông báo xác nhận rằng nó đã được tạo thành công trong thư mục app/Providers.

Mở tập tin đó và bạn sẽ thấy hai phương thức trong đó. Điều quan trọng trong ngữ cảnh của bài viết này là phương thức register. Vâng, lúc này thì nó trống rỗng, vì vậy chúng ta hãy thêm một số thứ để làm cho nó hữu ích hơn.

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

Phương thức register được sử dụng để đăng ký các phụ thuộc của bạn và chúng ta đã làm xong điều đó. Chúng ta đã bao gồm tập tin helper tùy biến của chúng ta.

Tập tin app/Providers/EnvatoServiceProvider.php sẽ trông giống như sau sau khi sửa đổi.

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
}

Như vậy, đến lúc này tất cả đều khá ổn. Chúng ta có helper tuỳ biến và service provider của chúng ta.

Tiếp theo, chúng ta cần thông báo cho Laravel về service provider của chúng ta để nó có thể nạp nó trong quá trình khởi động. Hãy mở config/app.php và thêm các mục sau đây vào cuối mảng providers.

1
App\Providers\EnvatoServiceProvider::class,

Để sử dụng helper của chúng ta theo một cách thuận tiện, chúng ta cũng có thể tạo ra một bí danh. Vì vậy, chúng ta hãy làm điều đó bằng cách thêm mục sau đây vào cuối mảng aliases trong cùng một tập tin.

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

Bằng cách định nghĩa mục này, chúng ta có thể gọi helper của chúng ta bằng cách sử dụng từ khóa EnvatoUser. Khá thuận tiện, phải không? Để tham khảo, dưới đây là tập tin config/app.php hoàn chỉnh.

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
];

Chúng ta đã gần xong! Chúng ta đã làm tất cả những công việc khó khăn để đến được đây, và bây giờ chúng ta có thể gặt hái những thành quả của helper tùy biến của chúng ta.

Sử dụng Helper Đầu tiên của Bạn

Một lần nữa, để giữ cho mọi thứ đơn giản và dễ hiểu, chúng ta sẽ định nghĩa một route cơ bản trong Laravel và gọi helper của chúng ta từ đó!

Tiếp tục và tạo một tập tin routes/web.php với các nội dung sau:

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
});

Điều đó có cần lời giải thích nào không? Chúng ta đã gọi helper tùy biến bằng cách viết tắt EnvatoUser::get_username, và nó sẽ trả về username.

Tất nhiên, bạn có thể gọi helper của chúng ta từ bất cứ nơi nào trong ứng dụng, có thể là một controller hoặc view.

Như vậy là đã kết thúc câu chuyện của chúng ta ngày hôm nay.

Tóm tắt

Các helper trong Laravel thật sự là một tính năng mạnh mẽ và tôi chắc chắn rằng với vai trò là một nhà phát triển, bạn sẽ muốn mở rộng nó. Và đó là chủ đề của ngày hôm nay—chúng ta đã đi qua những điều cơ bản của cấu trúc tập tin helper trong Laravel và tạo ra một helper hữu ích.

Tôi hy vọng bạn thích bài viết này và nó giúp bạn tạo ra những helper tuỳ biến cho việc phát triển ứng dụng Laravel hàng ngày của bạn.

Đừng ngần ngại để lại nhận xét và yêu cầu của bạn trong phần bình luận bên dưới. Tôi cũng theo dõi những ý kiến trên Twitter của tôi và trả lời chúng ngay khi tôi có thể!