+2

Tự tạo helper function cho riêng mình trong project Laravel

Bài dịch từ trang laravel-news.com

Laravel cung cấp sẵn rất nhiều helper function tuyệt vời và rất tiện lợi cho bạn làm việc với arrays, file paths, strings, và routes, đặc biệt là hàm dd(). Bạn cũng có thể tự viết cho mình các helper function for project Laravel và các packages PHP bằng cách sử dụng Composer để import một cách tự động.

Creating a Helpers file in a Laravel App

Điều đầu tiên là bạn phải để các function helper trong project Laravel của mình. Tùy theo sở thích của mình mà bạn có thể lưu trữ file helps ở chỗ bạn thích, có một vài gợi ý cho bạn:

  • app/helpers.php
  • app/Http/helpers.php Tôi thì thích dùng app/helpers.php trong namespace của thư mục gốc.

Autoloading

Để sử dụng được PHP helper function, bạn phải load nó vào projec theo thời gian thực. Trước đây, tôi thường thấy những thứ như thế này ở đầu tệp tin:

require_once ROOT . '/helpers.php';

Nhưng không thể tải PHP functions một cách tự động. Tuy nhiên chúng ta có cách giải quyết khác bằng việc sử dụng Composer, nó tốt hơn là sử dụng require hoặc require_once. Nhìn vào project Larave, bạn sẽ nhìn thấy keys autoload và autoload-dev trong composer.json file:

"autoload": {
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},
"autoload-dev": {
    "psr-4": {
        "Tests\\": "tests/"
    }
},

Nếu bạn muốn thêm một file hepler, Composer có key file trong autoload, bạn có thể viết file vào đó.

"autoload": {
    "files": [
        "app/helpers.php"
    ],
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},

Sau đó, bạn cần chạy dump autoload:

composer dump-autoload

Từ giờ trở đi file helpers.php sẽ được gọi tự động bởi vì Laravel đã yêu cầu Composer’s autoloader trong public/index.php:

require __DIR__.'/../vendor/autoload.php';

Defining Functions

Viết function trong helpers class thật sự rất dễ, tuy nhiên cũng có một vài lưu ý. Tất cả các helper function cần phải nằm trong một câu lệnh kiểm tra sự tồn tại của hàm để tránh sự định nghĩa trùng lặp.

if (! function_exists('env')) {
    function env($key, $default = null) {
        // ...
    }
}

Điều này có thể giúp bạn tránh được việc sử dụng phải các function mà bạn không mong đợi mà lại có tên trùng với cái bạn đang muốn gọi đến. Trong thực tế, sự trung lặp không hề sảy ra nhiều như bạn nghĩ, tuy nhiên bạn nên đảm bảo rằng tên của function được đặt không quá chung chung. Bạn cũng có thể đặt tên tiền tố trước tên của function để hạn chế sự trung lặp.

Helper Example

Khi tôi sử dụng resource routing trong Laravel, tôi muốn thêm một vài helper function để xác định các routes trong template một cách dễ dàng hơn. Trong thực hiện của tôi, tôi muốn có một helper function có thể giúp tôi vượt qua Eloquent model và lấy về một resource route bằng các convention mà tôi đã định nghĩa, chẳng hạn như:

create_route($model);
edit_route($model);
show_route($model);
destroy_route($model);

Đây là cách bạn có thể định nghĩa một show_route trong tệp app / helpers.php của bạn:

if (! function_exists('show_route')) {
    function show_route($model, $resource = null)
    {
        $resource = $resource ?? plural_from_model($model);

        return route("{$resource}.show", $model);
    }
}

if (! function_exists('plural_from_model')) {
    function plural_from_model($model)
    {
        $plural = Str::plural(class_basename($model));

        return Str::kebab($plural);
    }
}

Hàm plural_from_model () chỉ là một số code sử dụng lại được mà các helper route functions sử dụng để dự đoán tên của route resource dựa trên một quy ước đặt tên mà tôi thích.

Ví dụ, đây là một ví dụ về resource name bắt nguồn từ model:

$model = new App\LineItem;
plural_from_model($model);
=> line-items

plural_from_model(new App\User);
=> users

Sử dụng quy ước này bạn sẽ xác định được resource route trong routes/web.php:

Route::resource('line-items', 'LineItemsController');
Route::resource('users', 'UsersController');

Và sau đó trong các blade templates của bạn, bạn có thể làm như sau:

<a href="{{ show_route($lineItem) }}">
    {{ $lineItem->name }}
</a>

Kết quả là:

<a href="http://localhost/line-items/1">
    Line Item #1
</a>

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí