掃二維碼與項目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流
一個(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ō)明。
我們在微信上24小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流