【问题标题】:Laravel function that can handle a request or strings可以处理请求或字符串的 Laravel 函数
【发布时间】:2022-01-27 15:49:29
【问题描述】:

我有一个函数:

public static function linkClient(Request $request){

//do things
}

这个函数被两个不同的东西调用。 1 是带有发布数据的发布请求。在这种情况下,这很好用:

public static function linkClient(Request $request){
   $data = $request->all();
    // do things with data
}

对该函数的第二次调用传递了 2 个字符串。我怎样才能使这个函数可以处理请求或字符串?

通俗地说,我会这样写:

 public static function linkClient(Request $request or $string1,$string2){
   if ($request){
      $data = $request->all();
      //do things to request
   }
   if($string1 or $string2){
     //do string things
   }
 }

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    你要找的是函数重载,php 不支持。您可以尝试使用以下方法将其破解:

    https://stackoverflow.com/a/4697712/3150636

    您在哪里检测到使用 func_num_args 传入的参数并从那里分支。

    【讨论】:

    • 所以我认为这是一个坏主意。除了 (params) 之外,第二个函数几乎与第一个函数完全一样,这是不好的代码吗?
    【解决方案2】:

    自 PHP 8.0 起,PHP 支持 Union types

     public static function linkClient(Request|string $request, $string2){
       if ($request instanceof Request){
          $data = $request->all();
          //do things to request
       } else {
         //do string things to $request
       }
     }
    

    缺点是没有内置机制来确保您使用单个 Request 参数或两个 string 参数调用函数,因为仅检查第一个参数。

    【讨论】:

      【解决方案3】:

      使用splat 运算符。 https://lornajane.net/posts/2014/php-5-6-and-the-splat-operator

      public static function linkClient(...$paras) 
      {
        if (count($paras) == 1) {
          echo 'Request $request passed';
          return;
        }
      
        echo 'Strings passed';
        print_r($paras);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-29
        • 1970-01-01
        • 2016-07-24
        • 1970-01-01
        • 1970-01-01
        • 2014-08-26
        • 1970-01-01
        相关资源
        最近更新 更多