【摘要】簡單的說一下宏能力,這個類是 IlluminateSupportTraitsMacroable 其中利用重載實現了能夠定義宏的功能,即經過 macro 靜態方法添加回調,並定義一個名字。利用 __call 當前類沒有這個函數的時候執行這個函數名註冊的回調。git
產生需求github
在使用 Laravel 開發 ThinkSNS Plus 的時候,由於不少功能塊都沒有寫在一個庫裏面,利用拓展包的形式添加實際功能,裏面不少地方也用到了「多態多對多」的關係。問題來了,開發一個問答程序,想要給用戶模型增長髮布的問題或者回答的關係,起初是繼承一份 User 模型,添加了關係,以後就發現問題了,由於用戶的 tag 是使用多態多對多的關係,我經過繼承的用戶模型是沒法拿到這種關係數據的由於 *able_type 是 user 數據模型類名稱或者別名。而我繼承以後類也就發生改變了。函數
完成需求ui
隨之想到,在 Laravel 中有一個 Trait 叫作 Macroable 而後發現 Builder 都有這種能力,而 Model 沒有,隨之也將這個 Trait 添加到要使用的model上,後來發現,若是其餘模型也要用是否是也要再添加一次?隨之寫了一份 Trait :spa
只要在要使用的 model 中 use 便可。繼承
使用圖片
有了這個 Trait 那麼咱們添加到 User 模型中,就可使用宏能力爲其動態添加函數了:開發
這樣,咱們能夠直接 :get
拿到用戶發佈的全部問題了。源碼
以上代碼都來自於ThinkSNS Plus,看完整的開發代碼能夠看倉庫:
GitHub: https://github.com/slimkit/th...(開源不易,求 Star )
ThinkSNS官網:http://thinksns.com/
開源版源碼官方正版獲取惟一渠道:關注公衆號「thinksns」,回覆「開源版」便可得到最新源碼壓縮文件地址。