Hướng dẫn helper php

Helper là những hàm trợ giúp mình tự thêm hoặc có sẵn giúp hỗ trợ trong dự án, việc sử dụng helper là điều cần thiết, ví dụ bạn muốn tương tác dữ liệu với Controller, View, Model chúng ta có thể dùng Helper để làm điều đó.

Trong bài này mình sẽ hướng dẫn bạn cách tạo Helper đơn giản trong Laravel.

Hàm mình muốn tạo là xuất ra giá trị tên của bất kỳ ai

hello("Tôi tên là Huỳnh Tòng");

Tạo thư mục Helpers và HelperServiceProvider

Tạo thư mục Helpers nằm trong thư mục app

Hướng dẫn helper php

Kế đến mở cmd và gõ lệnh sau ( Hoặc bạn có thể tạo thủ công )

php artisan make: provider HelperServiceProvider

Bạn sẽ có file app\Providers\HelperServiceProvider.php và ở register bạn chèn đoạn mã sau dùng để gọi các helper bạn sẽ tạo trong thư mục Helpers.

foreach (glob(app_path().'/Helpers/*.php') as $filename){
    require_once($filename);
}

Đăng ký HelperServiceProvider.php
Truy cập vào config/app.php và chèn vào providers

 App\Providers\HelperServiceProvider::class,

Hướng dẫn helper php

Tạo helper

Trong thư mục App\Helpers mình sẽ tạo file CustomHelper.php

if (!function_exists('hello')) {
    function hello($name)
    {
        return 'Hello ' . $name . '!';
    }
}

Hướng dẫn helper php

Sử dụng helper

Bây giờ bạn có thể dùng hàm hello() ở bất cứ đâu bạn muốn, ví dụ ở trong view:

{{ hello('tôi tên là Tòng') }}

Hướng dẫn helper php

Cám ơn bạn đã đọc bài viết, hi vọng qua bài này bạn có thể tự tạo các file helper theo ý bạn mong muốn

Video này hướng dẫn bạn cách tạo Helper trong Laravel Framework dễ dàng sau 1 tới 2 phút. Đây là cách thức giúp bạn có thể tạo ra các function dùng chung ở nhiều nơi ở trên dự án laravel của mình.

4 bước Tạo Helper file trong Laravel

Để tiện cho bạn theo dõi và thực hành, tôi có tạo video hướng dẫn cách tạo helper trong laravel. Bạn theo dõi video thực hành trực quan kết hợp với đọc check list 4 bước tạo helper ở bên dưới video.

Bước 1: Tạo folder Helpers

App\Helpers

Bước 2: Định nghĩa file helper mới

App\Helpers\helper-name.php

Bước 4: Autoload file helper

composer.json

Bước 4: Cách Sử dụng helper

Tạm kết

Trên đây tôi đã hướng dẫn bạn cách tạo và sử dụng helper trong laravel. Tôi hi vọng bài này hữu ích cho bạn. Nếu muốn học laravel để đi làm một cách bài bản bạn có thể xem thêm Laravel Pro tại unitop.vn.

Đừng quên theo dõi thêm các video hướng dẫn trên kênh youtube Unitop.vn – Học web đi làm để cập nhập thêm những bài học về lập trình web.

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.

where('userid', $user_id)->first();
        
        return (isset($user->username) ? $user->username : '');
    }
}

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

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.

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.

$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.

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.

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

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

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.

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.

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.

'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.

 'Laravel',

    /*
    |--------------------------------------------------------------------------
    | Application Environment
    |--------------------------------------------------------------------------
    |
    | This value determines the "environment" your application is currently
    | running in. This may determine how you prefer to configure various
    | services your application utilizes. Set this in your ".env" file.
    |
    */

    'env' => env('APP_ENV', 'production'),

    /*
    |--------------------------------------------------------------------------
    | Application Debug Mode
    |--------------------------------------------------------------------------
    |
    | When your application is in debug mode, detailed error messages with
    | stack traces will be shown on every error that occurs within your
    | application. If disabled, a simple generic error page is shown.
    |
    */

    'debug' => env('APP_DEBUG', false),

    /*
    |--------------------------------------------------------------------------
    | Application URL
    |--------------------------------------------------------------------------
    |
    | This URL is used by the console to properly generate URLs when using
    | the Artisan command line tool. You should set this to the root of
    | your application so that it is used when running Artisan tasks.
    |
    */

    'url' => env('APP_URL', 'https://localhost'),

    /*
    |--------------------------------------------------------------------------
    | Application Timezone
    |--------------------------------------------------------------------------
    |
    | Here you may specify the default timezone for your application, which
    | will be used by the PHP date and date-time functions. We have gone
    | ahead and set this to a sensible default for you out of the box.
    |
    */

    'timezone' => 'UTC',

    /*
    |--------------------------------------------------------------------------
    | Application Locale Configuration
    |--------------------------------------------------------------------------
    |
    | The application locale determines the default locale that will be used
    | by the translation service provider. You are free to set this value
    | to any of the locales which will be supported by the application.
    |
    */

    'locale' => 'en',

    /*
    |--------------------------------------------------------------------------
    | Application Fallback Locale
    |--------------------------------------------------------------------------
    |
    | The fallback locale determines the locale to use when the current one
    | is not available. You may change the value to correspond to any of
    | the language folders that are provided through your application.
    |
    */

    'fallback_locale' => 'en',

    /*
    |--------------------------------------------------------------------------
    | Encryption Key
    |--------------------------------------------------------------------------
    |
    | This key is used by the Illuminate encrypter service and should be set
    | to a random, 32 character string, otherwise these encrypted strings
    | will not be safe. Please do this before deploying an application!
    |
    */

    'key' => env('APP_KEY'),

    'cipher' => 'AES-256-CBC',

    /*
    |--------------------------------------------------------------------------
    | Logging Configuration
    |--------------------------------------------------------------------------
    |
    | Here you may configure the log settings for your application. Out of
    | the box, Laravel uses the Monolog PHP logging library. This gives
    | you a variety of powerful log handlers / formatters to utilize.
    |
    | Available Settings: "single", "daily", "syslog", "errorlog"
    |
    */

    'log' => env('APP_LOG', 'single'),

    'log_level' => env('APP_LOG_LEVEL', 'debug'),

    /*
    |--------------------------------------------------------------------------
    | Autoloaded Service Providers
    |--------------------------------------------------------------------------
    |
    | The service providers listed here will be automatically loaded on the
    | request to your application. Feel free to add your own services to
    | this array to grant expanded functionality to your applications.
    |
    */

    '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,
    ],

    /*
    |--------------------------------------------------------------------------
    | Class Aliases
    |--------------------------------------------------------------------------
    |
    | This array of class aliases will be registered when this application
    | is started. However, feel free to register as many as you wish as
    | the aliases are "lazy" loaded so they don't hinder performance.
    |
    */

    '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,
    ],

];

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:

Đ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ể!