18禁黄动漫网站禁片无遮挡观看|国产在线观看免费A∨|国产偷伦在线2020

  • 
    
    1. <table id="dwhxz"><cite id="dwhxz"></cite></table>
    2. thinkphp6使用invoke或app代替action實現調用控制器方法

      2022-07-04 09:59 欄目:技術開發 查看(8821)

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

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

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

      假設在home應用下,已經存在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,那是不是就不能直接利用框架自帶的工具來完成這樣的需求呢?答案肯定是否定的,實際上thinkphp還有兩個常用的助手函數可以實現這樣的需求,那就是invoke和app。

      1、invoke

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

      ?/**
       * 調用反射實例化對象或者執行方法 支持依賴注入
       * @param mixed $call 類名或者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);
      }

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

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

      2、app

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

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

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

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

      也可以把參數放在后面

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

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

      與我們的項目經理聯系
      掃二維碼與項目經理溝通

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

      解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯網交流

      轉載請注明出處:thinkphp6使用invoke或app代替action實現調用控制器方法 - 微構網絡
      分享:
    3. 
      
      1. <table id="dwhxz"><cite id="dwhxz"></cite></table>