2024国产成人精品免费视频|日本免费一区二区三区毛片|久久97超碰色中文字幕|亚洲天堂a中文字幕

thinkphp6使用invoke或app代替action實現(xiàn)調(diào)用控制器方法

2022-07-04 09:59 欄目:技術(shù)開發(fā) 查看(14696)

一個最典型的場景,如在同一個應(yīng)用(thinkphp5是模塊)下,A控制器有一個a方法,B控制器的b方法跟a方法類似,這時候如果要減少代碼的重復(fù),我們可以直接在b方法中復(fù)用a方法的邏輯,最簡單的邏輯,就是把a(bǔ)、b的調(diào)用的邏輯全部寫到公共應(yīng)用或模塊中。但實際上即便所有的邏輯全部寫在A、B控制器中,也可以實現(xiàn)調(diào)用。

在thinkphp5中框架自帶了一個助手函數(shù)action。在b方法中調(diào)用a方法的代碼也很簡單:

return action('A/a',[參數(shù)]);

假設(shè)在home應(yīng)用下,已經(jīng)存在Posts控制器的index方法,需要在Pages控制器的index方法中調(diào)用。且index可以接受參數(shù)name。Posts控制器的示例代碼如下:

namespace app\home\controller;
use app\common\controller\HomeBase;
class Posts extends HomeBase{
    public? function? index($name=''){
         return $name;
    }
}

那么控制器Pages的示例代碼如下:

namespace app\home\controller;
use app\common\controller\HomeBase;
class Pages extends HomeBase{
    public? function? index(){
         $name='test';
         return action('Posts/index',[$name]);//核心代碼①
    }
}

而在thinkphp6中框架取消了助手函數(shù)action,那是不是就不能直接利用框架自帶的工具來完成這樣的需求呢?答案肯定是否定的,實際上thinkphp還有兩個常用的助手函數(shù)可以實現(xiàn)這樣的需求,那就是invoke和app。

1、invoke

invoke用于調(diào)用反射執(zhí)行callable,支持依賴注入,方法代碼如下:

?/**
 * 調(diào)用反射實例化對象或者執(zhí)行方法 支持依賴注入
 * @param mixed $call 類名或者callable
 * @param array $args 參數(shù)
 * @return mixed
 */
function invoke($call, array $args = [])
{
   if (is_callable($call)) {
      return Container::getInstance()->invoke($call, $args);
   } 
   return Container::getInstance()->invokeClass($call, $args);
}

實現(xiàn)上述需求的示例代碼(把上面示例中的核心代碼①修改)如下:

return invoke(['app\home\controller\Posts','index'],[$name]);

2、app

invoke用于快速獲取容器中的實例,支持依賴注入,方法代碼如下:

/**
 * 快速獲取容器中的實例 支持依賴注入
 * @param string $name 類名或標(biāo)識 默認(rèn)獲取當(dāng)前應(yīng)用實例
 * @param array $args 參數(shù)
 * @param bool $newInstance 是否每次創(chuàng)建新的實例
 * @return object|App
 */
function app(string $name = '', array $args = [], bool $newInstance = false)
{
   return Container::getInstance()->make($name ?: App::class, $args, $newInstance);
}

實現(xiàn)上述需求的示例代碼(把上面示例中的核心代碼①修改)如下:

return app('app\home\controller\Posts',[$name])->index();

也可以把參數(shù)放在后面

return app('app\home\controller\Posts')->index($name);

這樣我們就使用invoke或app代替action實現(xiàn)調(diào)用控制器方法,關(guān)于invoke和app助手函數(shù)的具體用法大家可以詳細(xì)閱讀thinkphp官方文檔的詳細(xì)說明。

與我們的項目經(jīng)理聯(lián)系
掃二維碼與項目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流

轉(zhuǎn)載請注明出處:thinkphp6使用invoke或app代替action實現(xiàn)調(diào)用控制器方法 - 微構(gòu)網(wǎng)絡(luò)
分享:
標(biāo)簽:
寿光市| 扬州市| 兴文县| 陵川县| 阳谷县| 邵武市| 阳城县| 游戏| 阳新县| 安西县| 霞浦县| 清新县| 南汇区| 安塞县| 遂宁市| 黑山县| 衡阳县| 黄龙县| 甘洛县| 通辽市| 娱乐| 合阳县| 团风县| 讷河市| 海安县| 屏边| 合肥市| 尖扎县| 封开县| 收藏| 鹤山市| 舒城县| 镇安县| 淄博市| 宜兴市| 玉林市| 定南县| 兰州市| 霍林郭勒市| 洛宁县| 平昌县|