Blame view

public/vendor/illuminate/support/Traits/ReflectsClosures.php 1.43 KB
86143e36f   Андрей Ларионов   Коммит вторник
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  <?php
  
  namespace Illuminate\Support\Traits;
  
  use Closure;
  use Illuminate\Support\Reflector;
  use ReflectionFunction;
  use RuntimeException;
  
  trait ReflectsClosures
  {
      /**
       * Get the class names / types of the parameters of the given Closure.
       *
       * @param  \Closure  $closure
       * @return array
       *
       * @throws \ReflectionException
       */
      protected function closureParameterTypes(Closure $closure)
      {
          $reflection = new ReflectionFunction($closure);
  
          return collect($reflection->getParameters())->mapWithKeys(function ($parameter) {
              if ($parameter->isVariadic()) {
                  return [$parameter->getName() => null];
              }
  
              return [$parameter->getName() => Reflector::getParameterClassName($parameter)];
          })->all();
      }
  
      /**
       * Get the class name of the first parameter of the given Closure.
       *
       * @param  \Closure  $closure
       * @return string
       *
       * @throws \ReflectionException|\RuntimeException
       */
      protected function firstClosureParameterType(Closure $closure)
      {
          $types = array_values($this->closureParameterTypes($closure));
  
          if (! $types) {
              throw new RuntimeException('The given Closure has no parameters.');
          }
  
          if ($types[0] === null) {
              throw new RuntimeException('The first parameter of the given Closure is missing a type hint.');
          }
  
          return $types[0];
      }
  }