Passed
Pull Request — master (#1076)
by Maxim
10:13
created
src/Core/tests/Scope/ScopeAttributeTest.php 1 patch
Braces   +40 added lines, -19 removed lines patch added patch discarded remove patch
@@ -33,8 +33,10 @@  discard block
 block discarded – undo
33 33
     {
34 34
         $root = new Container();
35 35
 
36
-        $root->runScoped(static function (Container $c1) {
37
-            $c1->runScoped(static function (Container $c2) use ($c1) {
36
+        $root->runScoped(static function (Container $c1)
37
+        {
38
+            $c1->runScoped(static function (Container $c2) use ($c1)
39
+            {
38 40
                 $obj1 = $c1->get(AttrScopeFooSingleton::class);
39 41
                 $obj2 = $c2->get(AttrScopeFooSingleton::class);
40 42
 
@@ -48,8 +50,10 @@  discard block
 block discarded – undo
48 50
         $root = new Container();
49 51
         $root->getBinder('bar')->bindSingleton('binding', static fn () => new AttrScopeFoo());
50 52
 
51
-        $root->runScoped(static function (Container $fooScope) {
52
-            $fooScope->runScoped(static function (Container $container) {
53
+        $root->runScoped(static function (Container $fooScope)
54
+        {
55
+            $fooScope->runScoped(static function (Container $container)
56
+            {
53 57
                 self::assertInstanceOf(AttrScopeFoo::class, $container->get('binding'));
54 58
             }, name: 'bar');
55 59
         }, name: 'foo');
@@ -63,8 +67,10 @@  discard block
 block discarded – undo
63 67
         $root = new Container();
64 68
         $root->getBinder('bar')->bindSingleton('binding', static fn () => new AttrScopeFoo());
65 69
 
66
-        $root->runScoped(static function (Container $fooScope) {
67
-            $fooScope->runScoped(static function (Container $container) {
70
+        $root->runScoped(static function (Container $fooScope)
71
+        {
72
+            $fooScope->runScoped(static function (Container $container)
73
+            {
68 74
                 self::assertInstanceOf(AttrScopeFoo::class, $container->get('binding'));
69 75
             }, name: 'bar');
70 76
         }, name: 'baz');
@@ -83,8 +89,10 @@  discard block
 block discarded – undo
83 89
         $root = new Container();
84 90
         $root->bind('foo', self::makeFooScopeObject(...));
85 91
 
86
-        $root->runScoped(static function (Container $c1) {
87
-            $c1->runScoped(static function (Container $c2) {
92
+        $root->runScoped(static function (Container $c1)
93
+        {
94
+            $c1->runScoped(static function (Container $c2)
95
+            {
88 96
                 $c2->get('foo');
89 97
             }, name: 'foo');
90 98
         });
@@ -102,8 +110,10 @@  discard block
 block discarded – undo
102 110
         $root = new Container();
103 111
         $root->bind('foo', self::makeFooScopeObject(...));
104 112
 
105
-        $root->runScoped(static function (Container $c1) {
106
-            $c1->runScoped(static function (Container $c2) {
113
+        $root->runScoped(static function (Container $c1)
114
+        {
115
+            $c1->runScoped(static function (Container $c2)
116
+            {
107 117
                 $c2->get('foo');
108 118
             });
109 119
         });
@@ -121,15 +131,21 @@  discard block
 block discarded – undo
121 131
 
122 132
         $root = new Container();
123 133
 
124
-        try {
125
-            $root->runScoped(static function (Container $c1) {
126
-                $c1->runScoped(static function (Container $c2) {
127
-                    $c2->runScoped(static function (Container $c3) {
134
+        try
135
+        {
136
+            $root->runScoped(static function (Container $c1)
137
+            {
138
+                $c1->runScoped(static function (Container $c2)
139
+                {
140
+                    $c2->runScoped(static function (Container $c3)
141
+                    {
128 142
                         // do nothing
129 143
                     }, name: 'root');
130 144
                 });
131 145
             });
132
-        } catch (NamedScopeDuplicationException $e) {
146
+        }
147
+        catch (NamedScopeDuplicationException $e)
148
+        {
133 149
             self::assertSame('root', $e->getScope());
134 150
             throw $e;
135 151
         }
@@ -144,14 +160,19 @@  discard block
 block discarded – undo
144 160
     {
145 161
         self::expectException(BadScopeException::class);
146 162
 
147
-        try {
163
+        try
164
+        {
148 165
             $root = new Container();
149
-            $root->runScoped(static function (Container $c1) {
150
-                $c1->runScoped(static function (Container $c2) {
166
+            $root->runScoped(static function (Container $c1)
167
+            {
168
+                $c1->runScoped(static function (Container $c2)
169
+                {
151 170
                     $c2->get(AttrScopeFoo::class);
152 171
                 });
153 172
             }, name: 'bar');
154
-        } catch (BadScopeException $e) {
173
+        }
174
+        catch (BadScopeException $e)
175
+        {
155 176
             self::assertSame('foo', $e->getScope());
156 177
             throw $e;
157 178
         }
Please login to merge, or discard this patch.
src/Core/src/Internal/Factory.php 1 patch
Braces   +123 added lines, -53 removed lines patch added patch discarded remove patch
@@ -68,17 +68,20 @@  discard block
 block discarded – undo
68 68
      */
69 69
     public function make(string $alias, array $parameters = [], Stringable|string|null $context = null): mixed
70 70
     {
71
-        if ($parameters === [] && \array_key_exists($alias, $this->state->singletons)) {
71
+        if ($parameters === [] && \array_key_exists($alias, $this->state->singletons))
72
+        {
72 73
             return $this->state->singletons[$alias];
73 74
         }
74 75
 
75 76
         $binding = $this->state->bindings[$alias] ?? null;
76 77
 
77
-        if ($binding === null) {
78
+        if ($binding === null)
79
+        {
78 80
             return $this->resolveWithoutBinding($alias, $parameters, $context);
79 81
         }
80 82
 
81
-        try {
83
+        try
84
+        {
82 85
             $this->tracer->push(
83 86
                 false,
84 87
                 action: 'resolve from binding',
@@ -106,7 +109,9 @@  discard block
 block discarded – undo
106 109
                     ->resolveWeakReference($binding, $alias, $context, $parameters),
107 110
                 default => $binding,
108 111
             };
109
-        } finally {
112
+        }
113
+        finally
114
+        {
110 115
             $this->state->bindings[$alias] ??= $binding;
111 116
             $this->tracer->pop(true);
112 117
             $this->tracer->pop(false);
@@ -120,18 +125,23 @@  discard block
 block discarded – undo
120 125
     private function resolveInjector(Injectable $binding, Ctx $ctx, array $arguments)
121 126
     {
122 127
         $context = $ctx->context;
123
-        try {
128
+        try
129
+        {
124 130
             $reflection = $ctx->reflection ??= new \ReflectionClass($ctx->class);
125
-        } catch (\ReflectionException $e) {
131
+        }
132
+        catch (\ReflectionException $e)
133
+        {
126 134
             throw new ContainerException($e->getMessage(), $e->getCode(), $e);
127 135
         }
128 136
 
129 137
         $injector = $binding->injector;
130 138
 
131
-        try {
139
+        try
140
+        {
132 141
             $injectorInstance = \is_object($injector) ? $injector : $this->container->get($injector);
133 142
 
134
-            if (!$injectorInstance instanceof InjectorInterface) {
143
+            if (!$injectorInstance instanceof InjectorInterface)
144
+            {
135 145
                 throw new InjectionException(
136 146
                     \sprintf(
137 147
                         "Class '%s' must be an instance of InjectorInterface for '%s'.",
@@ -158,7 +168,8 @@  discard block
 block discarded – undo
158 168
                 default => (string)$context,
159 169
             });
160 170
 
161
-            if (!$reflection->isInstance($instance)) {
171
+            if (!$reflection->isInstance($instance))
172
+            {
162 173
                 throw new InjectionException(
163 174
                     \sprintf(
164 175
                         "Invalid injection response for '%s'.",
@@ -168,7 +179,9 @@  discard block
 block discarded – undo
168 179
             }
169 180
 
170 181
             return $instance;
171
-        } finally {
182
+        }
183
+        finally
184
+        {
172 185
             $this->state->bindings[$ctx->class] ??= $binding;
173 186
         }
174 187
     }
@@ -187,7 +200,8 @@  discard block
 block discarded – undo
187 200
             //Binding is pointing to something else
188 201
             : $this->make($binding->alias, $arguments, $context);
189 202
 
190
-        if ($binding->singleton && $arguments === []) {
203
+        if ($binding->singleton && $arguments === [])
204
+        {
191 205
             $this->state->singletons[$alias] = $result;
192 206
         }
193 207
 
@@ -228,11 +242,14 @@  discard block
 block discarded – undo
228 242
         array $arguments,
229 243
     ): mixed {
230 244
         $ctx = new Ctx(alias: $alias, class: $alias, context: $context, singleton: $binding->singleton);
231
-        try {
245
+        try
246
+        {
232 247
             $instance = $binding::class === \Spiral\Core\Config\Factory::class && $binding->getParametersCount() === 0
233 248
                 ? ($binding->factory)()
234 249
                 : $this->invoker->invoke($binding->factory, $arguments);
235
-        } catch (NotCallableException $e) {
250
+        }
251
+        catch (NotCallableException $e)
252
+        {
236 253
             throw new ContainerException(
237 254
                 $this->tracer->combineTraceMessage(\sprintf('Invalid binding for `%s`.', $ctx->alias)),
238 255
                 $e->getCode(),
@@ -251,19 +268,24 @@  discard block
 block discarded – undo
251 268
     ): ?object {
252 269
         $avoidCache = $arguments !== [];
253 270
 
254
-        if (($avoidCache || $binding->reference->get() === null) && \class_exists($alias)) {
255
-            try {
271
+        if (($avoidCache || $binding->reference->get() === null) && \class_exists($alias))
272
+        {
273
+            try
274
+            {
256 275
                 $this->tracer->push(false, alias: $alias, source: WeakReference::class, context: $context);
257 276
 
258 277
                 $object = $this->createInstance(
259 278
                     new Ctx(alias: $alias, class: $alias, context: $context),
260 279
                     $arguments,
261 280
                 );
262
-                if ($avoidCache) {
281
+                if ($avoidCache)
282
+                {
263 283
                     return $object;
264 284
                 }
265 285
                 $binding->reference = WeakReference::create($object);
266
-            } catch (\Throwable) {
286
+            }
287
+            catch (\Throwable)
288
+            {
267 289
                 throw new ContainerException(
268 290
                     $this->tracer->combineTraceMessage(
269 291
                         \sprintf(
@@ -273,7 +295,9 @@  discard block
 block discarded – undo
273 295
                         )
274 296
                     )
275 297
                 );
276
-            } finally {
298
+            }
299
+            finally
300
+            {
277 301
                 $this->tracer->pop();
278 302
             }
279 303
         }
@@ -288,19 +312,26 @@  discard block
 block discarded – undo
288 312
     ): mixed {
289 313
         $parent = $this->scope->getParentFactory();
290 314
 
291
-        if ($parent !== null) {
292
-            try {
315
+        if ($parent !== null)
316
+        {
317
+            try
318
+            {
293 319
                 $this->tracer->push(false, ...[
294 320
                     'current scope' => $this->scope->getScopeName(),
295 321
                     'jump to parent scope' => $this->scope->getParentScope()->getScopeName(),
296 322
                 ]);
297 323
                 /** @psalm-suppress TooManyArguments */
298 324
                 return $parent->make($alias, $parameters, $context);
299
-            } catch (BadScopeException $e) {
300
-                if ($this->scope->getScopeName() !== $e->getScope()) {
325
+            }
326
+            catch (BadScopeException $e)
327
+            {
328
+                if ($this->scope->getScopeName() !== $e->getScope())
329
+                {
301 330
                     throw $e;
302 331
                 }
303
-            } catch (ContainerExceptionInterface $e) {
332
+            }
333
+            catch (ContainerExceptionInterface $e)
334
+            {
304 335
                 $className = match (true) {
305 336
                     $e instanceof NotFoundException => NotFoundException::class,
306 337
                     default => ContainerException::class,
@@ -309,19 +340,24 @@  discard block
 block discarded – undo
309 340
                     'Can\'t resolve `%s`.',
310 341
                     $alias,
311 342
                 )), previous: $e);
312
-            } finally {
343
+            }
344
+            finally
345
+            {
313 346
                 $this->tracer->pop(false);
314 347
             }
315 348
         }
316 349
 
317 350
         $this->tracer->push(false, action: 'autowire', alias: $alias, context: $context);
318
-        try {
351
+        try
352
+        {
319 353
             //No direct instructions how to construct class, make is automatically
320 354
             return $this->autowire(
321 355
                 new Ctx(alias: $alias, class: $alias, context: $context),
322 356
                 $parameters,
323 357
             );
324
-        } finally {
358
+        }
359
+        finally
360
+        {
325 361
             $this->tracer->pop(false);
326 362
         }
327 363
     }
@@ -371,10 +407,13 @@  discard block
 block discarded – undo
371 407
         // Check scope name
372 408
         $ctx->reflection = new \ReflectionClass($instance);
373 409
         $scopeName = ($ctx->reflection->getAttributes(ScopeAttribute::class)[0] ?? null)?->newInstance()->name;
374
-        if ($scopeName !== null && $scopeName !== $this->scope->getScopeName()) {
410
+        if ($scopeName !== null && $scopeName !== $this->scope->getScopeName())
411
+        {
375 412
             $parent = $this->scope->getParentScope();
376
-            while ($parent !== null) {
377
-                if ($correctScope = $parent->getScopeName() === $scopeName) {
413
+            while ($parent !== null)
414
+            {
415
+                if ($correctScope = $parent->getScopeName() === $scopeName)
416
+                {
378 417
                     break;
379 418
                 }
380 419
                 $parent = $parent->getParentScope();
@@ -405,24 +444,30 @@  discard block
 block discarded – undo
405 444
         array $arguments,
406 445
     ): object {
407 446
         $class = $ctx->class;
408
-        try {
447
+        try
448
+        {
409 449
             $ctx->reflection = $reflection = new \ReflectionClass($class);
410
-        } catch (\ReflectionException $e) {
450
+        }
451
+        catch (\ReflectionException $e)
452
+        {
411 453
             throw new ContainerException($e->getMessage(), $e->getCode(), $e);
412 454
         }
413 455
 
414 456
         // Check scope name
415 457
         $scope = ($reflection->getAttributes(ScopeAttribute::class)[0] ?? null)?->newInstance()->name;
416
-        if ($scope !== null && $scope !== $this->scope->getScopeName()) {
458
+        if ($scope !== null && $scope !== $this->scope->getScopeName())
459
+        {
417 460
             throw new BadScopeException($scope, $class);
418 461
         }
419 462
 
420 463
         // We have to construct class using external injector when we know the exact context
421
-        if ($arguments === [] && $this->binder->hasInjector($class)) {
464
+        if ($arguments === [] && $this->binder->hasInjector($class))
465
+        {
422 466
             return $this->resolveInjector($this->state->bindings[$ctx->class], $ctx, $arguments);
423 467
         }
424 468
 
425
-        if (!$reflection->isInstantiable()) {
469
+        if (!$reflection->isInstantiable())
470
+        {
426 471
             $itIs = match (true) {
427 472
                 $reflection->isEnum() => 'Enum',
428 473
                 $reflection->isAbstract() => 'Abstract class',
@@ -435,12 +480,16 @@  discard block
 block discarded – undo
435 480
 
436 481
         $constructor = $reflection->getConstructor();
437 482
 
438
-        if ($constructor !== null) {
439
-            try {
483
+        if ($constructor !== null)
484
+        {
485
+            try
486
+            {
440 487
                 $this->tracer->push(false, action: 'resolve arguments', signature: $constructor);
441 488
                 $this->tracer->push(true);
442 489
                 $args = $this->resolver->resolveArguments($constructor, $arguments);
443
-            } catch (ValidationException $e) {
490
+            }
491
+            catch (ValidationException $e)
492
+            {
444 493
                 throw new ContainerException(
445 494
                     $this->tracer->combineTraceMessage(
446 495
                         \sprintf(
@@ -450,22 +499,31 @@  discard block
 block discarded – undo
450 499
                         )
451 500
                     ),
452 501
                 );
453
-            } finally {
502
+            }
503
+            finally
504
+            {
454 505
                 $this->tracer->pop(true);
455 506
                 $this->tracer->pop(false);
456 507
             }
457
-            try {
508
+            try
509
+            {
458 510
                 // Using constructor with resolved arguments
459 511
                 $this->tracer->push(false, call: "$class::__construct", arguments: $args);
460 512
                 $this->tracer->push(true);
461 513
                 $instance = new $class(...$args);
462
-            } catch (\TypeError $e) {
514
+            }
515
+            catch (\TypeError $e)
516
+            {
463 517
                 throw new WrongTypeException($constructor, $e);
464
-            } finally {
518
+            }
519
+            finally
520
+            {
465 521
                 $this->tracer->pop(true);
466 522
                 $this->tracer->pop(false);
467 523
             }
468
-        } else {
524
+        }
525
+        else
526
+        {
469 527
             // No constructor specified
470 528
             $instance = $reflection->newInstance();
471 529
         }
@@ -483,13 +541,15 @@  discard block
 block discarded – undo
483 541
         $instance = $this->runInflector($instance);
484 542
 
485 543
         //Declarative singletons
486
-        if ($this->isSingleton($ctx)) {
544
+        if ($this->isSingleton($ctx))
545
+        {
487 546
             $this->state->singletons[$ctx->alias] = $instance;
488 547
         }
489 548
 
490 549
         // Register finalizer
491 550
         $finalizer = $this->getFinalizer($ctx, $instance);
492
-        if ($finalizer !== null) {
551
+        if ($finalizer !== null)
552
+        {
493 553
             $this->state->finalizers[] = $finalizer;
494 554
         }
495 555
 
@@ -501,12 +561,14 @@  discard block
 block discarded – undo
501 561
      */
502 562
     private function isSingleton(Ctx $ctx): bool
503 563
     {
504
-        if ($ctx->singleton === true) {
564
+        if ($ctx->singleton === true)
565
+        {
505 566
             return true;
506 567
         }
507 568
 
508 569
         /** @psalm-suppress RedundantCondition https://github.com/vimeo/psalm/issues/9489 */
509
-        if ($ctx->reflection->implementsInterface(SingletonInterface::class)) {
570
+        if ($ctx->reflection->implementsInterface(SingletonInterface::class))
571
+        {
510 572
             return true;
511 573
         }
512 574
 
@@ -520,7 +582,8 @@  discard block
 block discarded – undo
520 582
          * @var Finalize|null $attribute
521 583
          */
522 584
         $attribute = ($ctx->reflection->getAttributes(Finalize::class)[0] ?? null)?->newInstance();
523
-        if ($attribute === null) {
585
+        if ($attribute === null)
586
+        {
524 587
             return null;
525 588
         }
526 589
 
@@ -534,10 +597,14 @@  discard block
 block discarded – undo
534 597
     {
535 598
         $scope = $this->scope;
536 599
 
537
-        while ($scope !== null) {
538
-            foreach ($this->state->inflectors as $class => $inflectors) {
539
-                if ($instance instanceof $class) {
540
-                    foreach ($inflectors as $inflector) {
600
+        while ($scope !== null)
601
+        {
602
+            foreach ($this->state->inflectors as $class => $inflectors)
603
+            {
604
+                if ($instance instanceof $class)
605
+                {
606
+                    foreach ($inflectors as $inflector)
607
+                    {
541 608
                         $instance = $inflector->getParametersCount() > 1
542 609
                             ? $this->invoker->invoke($inflector->inflector, [$instance])
543 610
                             : ($inflector->inflector)($instance);
@@ -553,9 +620,12 @@  discard block
 block discarded – undo
553 620
 
554 621
     private function validateArguments(ContextFunction $reflection, array $arguments = []): bool
555 622
     {
556
-        try {
623
+        try
624
+        {
557 625
             $this->resolver->validateArguments($reflection, $arguments);
558
-        } catch (\Throwable) {
626
+        }
627
+        catch (\Throwable)
628
+        {
559 629
             return false;
560 630
         }
561 631
 
Please login to merge, or discard this patch.