国产又猛又爽又黄视频|在线观看人成视频免费|少妇高潮太爽了在线视频|911国产免费无码专区|特黄做受又大又粗又长大片|欧美一级二级免费在线观看|日日夜人人澡人人澡人人看免|欧洲午夜精品一级毛片在线播放

thinkphp6使用invoke或app代替action實(shí)現調用控制器方法

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

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

在thinkphp5中框架自帶了一個(gè)助手函數action。在b方法中調用a方法的代碼也很簡(jiǎn)單:

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

假設在home應用下,已經(jīng)存在Posts控制器的index方法,需要在Pages控制器的index方法中調用。且index可以接受參數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中框架取消了助手函數action,那是不是就不能直接利用框架自帶的工具來(lái)完成這樣的需求呢?答案肯定是否定的,實(shí)際上thinkphp還有兩個(gè)常用的助手函數可以實(shí)現這樣的需求,那就是invoke和app。

1、invoke

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

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

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

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

2、app

invoke用于快速獲取容器中的實(shí)例,支持依賴(lài)注入,方法代碼如下:

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

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

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

也可以把參數放在后面

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

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

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

我們在微信上24小時(shí)期待你的聲音

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

轉載請注明出處:thinkphp6使用invoke或app代替action實(shí)現調用控制器方法 - 微構網(wǎng)絡(luò )
分享:
花垣县| 富阳市| 黑龙江省| 宜兰县| 浦江县| 六盘水市| 六枝特区| 静海县| 富蕴县| 太仆寺旗| 绥化市| 连城县| 阳江市| 金沙县| 凌云县| 屏南县| 临海市| 武川县| 阿图什市| 六盘水市| 宜章县| 池州市| 清水河县| 泽库县| 平江县| 正蓝旗| 化州市| 鄂尔多斯市| 玛曲县| 潍坊市| 嘉义县| 庄河市| 增城市| 前郭尔| 东乌珠穆沁旗| 高州市| 营山县| 鹤山市| 抚州市| 兰西县| 门头沟区|