Laravel 新增自定義助手函式

softer發表於2020-05-29

前言

在學習完教程中新增自定義助手函式檔案時,還是得記錄一下,感覺對composer知道的東西太少了,一些命令到底做了什麼還是不知道,總結一下。

新增自定義助手函式檔案

在開發專案的時候,有時候會定義一些函式,而這些函式又不能放在Laravel框架的助手函式檔案中,如果我們把程式碼部署到生產環境中,再使用composer install安裝擴充套件,又會覆蓋我們之前修改的檔案。

可見新增的函式必須要定義在我們的檔案中,而且這個檔案必須要納入到git倉庫中。這麼一來覺得放在app目錄還不錯,這個目錄是應用相關的目錄,像中介軟體、模型、控制器都在這個這個目錄。

所以我們在app目錄下新增helpers.php檔案,新增的函式就可以定義在這個檔案中了。

自動載入助手函式

在上面我們建立了助手函式檔案,把函式定義在app/helpers.php檔案中了,但是這個檔案不會被composer自動載入,如果要composer自動載入器載入我們定義的函式檔案,必須要告訴composer

如何告訴composer載入我們定義的助手函式檔案呢,很簡單,在專案根目錄中的composer.json檔案新增即可,怎麼新增也是有講究的,我把我新增的結果放在這裡。

...
"autoload": {
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "files": [
            "app/helpers.php"  #這行便是新增的助手函式
        ]
    },
.....

通過上面貼出的程式碼我們可以知道,在autoload引數下的files引數可以定義要新增的檔案,這個檔案在新增時要注意路徑,首先助手函式檔案helpers.phpapp目錄下,而app目錄和composer.json是在同一個目錄下,所以新增助手函式時應該這麼寫app/helpers.php,也就是說通過這個相對路徑可以找到對對應的檔案,不然composer的檔案載入會失敗。

定義了是不是就完事了呢,還沒有,composer在載入助手函式檔案時,並不是通過composer.json檔案來記載函式檔案,而是通過composer載入器定義的幾個檔案,每次從這些檔案中載入檔案。

所以我們在定義了函式檔案後需要執行composer dumpauotload指令,通過composer程式來生產載入檔案。執行後會修改vendor/composer目錄下的autoload_static.phpauoload_files.php檔案。

到底在檔案中修改了什麼呢,其實就是把定義的helpers.php新增到這個兩個檔案中,看下新增後的檔案內容。

// autoload_static.php
class ComposerStaticInit49922490dbe4935d5c7b9f60b23ceb32
{
    public static $files = array (
       // ......
        'ed962a97bd972bc82007176b647d4e36' => __DIR__ . '/..' . '/facade/ignition/src/helpers.php',
        'b4e3f29b106af37a2bb239f73cdf68c7' => __DIR__ . '/../..' . '/app/helpers.php',
    );

// auoload_files.php
return array(
    'ed962a97bd972bc82007176b647d4e36' => $vendorDir . '/facade/ignition/src/helpers.php',
    'b4e3f29b106af37a2bb239f73cdf68c7' => $baseDir . '/app/helpers.php',
    );

可以看到這兩個檔案中都有helpers.php檔案,具體用到哪個檔案呢,之後我會一篇文章來說明composer載入檔案的原理。

總結

一個小小的助手檔案,可以引出這麼多知識點,如果對這些知識點不瞭解,只是知道這麼做,而沒有去了解為什麼這麼做,學習就像是囫圇吞棗,下次估計會忘了使用composer dumpautoload來生產載入規則檔案,還不知道是哪裡出了問題。

這麼學習下來感覺一個小節可以學習很多知識點,時間消耗的也挺長了,寫這篇文章都已經過去半個小時了,感覺也沒有說什麼,就是把過程捋了一遍。

就這樣吧,如果把精力全部用在寫文章,而忘記是學習瞭解框架的,有點本末倒置了,寫文章的目的是加深學習,看看自己到底知道多少。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章