在 Laravel 中簡易的擴充 Blade Helper function

Extend blade helper function in laravel

February 2, 2017 - 3 minute read -
php laravel

App/Providers/AppServiceProvider.php 檔案內 register() 新增 loader 程式碼。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        // Reigister each helper files
        foreach (glob(app_path().'/Helpers/*.php') as $filename){
            require_once($filename);
        }

    }
}

搜尋 config/app.php 中的 providers 陣列,確認有正確載入 AppServiceProvider

'providers' => [

    /*
     * Application Service Providers...
     */
    App\Providers\AppServiceProvider::class,

]

app/Helpers/ 內新增自訂的 helper function 即可。(注意不要與官方提供的 helper function 衝突)

Helper function 可以很方便的用來像自訂時間顯示格式

app\Helpers\TimeElapsedString.php

<?php

/**
 * Get time eplapsed string (4 months, 2 weeks, 3 days, 1 hour, 49 minutes, 15 seconds ago)
 *
 * Example:
 *     echo time_elapsed_string('2013-05-01 00:22:35');
 *     echo time_elapsed_string('@1367367755'); # timestamp input
 *     echo time_elapsed_string('2013-05-01 00:22:35', true);  // get full string
 *
 * @param  Datetime  $datetime
 * @param  boolean   $full
 * @return string
 */
function time_elapsed_string($datetime, $full = false) {
    $now = new DateTime;
    $ago = new DateTime($datetime);
    $diff = $now->diff($ago);

    $diff->w = floor($diff->d / 7);
    $diff->d -= $diff->w * 7;

    $string = array(
        'y' => 'year',
        'm' => 'month',
        'w' => 'week',
        'd' => 'day',
        'h' => 'hour',
        'i' => 'minute',
        's' => 'second',
    );
    foreach ($string as $k => &$v) {
        if ($diff->$k) {
            $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
        } else {
            unset($string[$k]);
        }
    }

    if (!$full) $string = array_slice($string, 0, 1);
    return $string ? implode(', ', $string) . ' ago' : 'just now';
}

在 Blade 內只要使用

{{ time_elapsed_string($time) }}

即可很容易的顯示出自訂的時間格式。

當然,利用寫為 Service 能夠將容易重用的 method 自訂為 Helper function。

以下是用於自訂 Response json 格式的 Helper function 範例

app\Helpers\Response.php

<?php

/**
 * Response messages json format
 *
 * @param  integer  $code
 * @param  string   $messages
 * @param  array    $extend
 * @return \Illuminate\Http\Response
 */
function responseJSON($code, $messages, $extend = [])
{
    $data = [
        'code'  =>  $code,
        'messages'  =>  $messages,
    ];

    return response()->json(array_merge($data, $extend));
}

另一種作法則是透過 composer.json 設定 autoload 載入自訂的 Helper,

缺點則是較為缺乏彈性,若有多個 Helper 需要新增較不易管理及修改。

composer.json 中找到 autoload 選項後新增

"autoload": {
    "files": [
        "app/BladeHelper.php"
    ]
},

並且新增 app/BladeHelper.php 檔案,在裡面新增自訂的 Helper function 即可。