Skip to content

Commit 491d90d

Browse files
committed
Add context attribute
1 parent fba3b98 commit 491d90d

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Illuminate\Container\Attributes;
4+
5+
use Attribute;
6+
use Illuminate\Contracts\Container\Container;
7+
use Illuminate\Contracts\Container\ContextualAttribute;
8+
use Illuminate\Log\Context\Repository;
9+
10+
#[Attribute(Attribute::TARGET_PARAMETER)]
11+
class Context implements ContextualAttribute
12+
{
13+
/**
14+
* Create a new attribute instance.
15+
*/
16+
public function __construct(public string $key, public mixed $default = null)
17+
{
18+
}
19+
20+
/**
21+
* Resolve the configuration value.
22+
*
23+
* @param self $attribute
24+
* @param \Illuminate\Contracts\Container\Container $container
25+
* @return mixed
26+
*/
27+
public static function resolve(self $attribute, Container $container): mixed
28+
{
29+
return $container->make(Repository::class)->get($attribute->key, $attribute->default);
30+
}
31+
}

tests/Container/ContextualAttributeBindingTest.php

+24
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Illuminate\Container\Attributes\Authenticated;
1212
use Illuminate\Container\Attributes\Cache;
1313
use Illuminate\Container\Attributes\Config;
14+
use Illuminate\Container\Attributes\Context;
1415
use Illuminate\Container\Attributes\CurrentUser;
1516
use Illuminate\Container\Attributes\Database;
1617
use Illuminate\Container\Attributes\Log;
@@ -28,8 +29,10 @@
2829
use Illuminate\Database\Eloquent\Model;
2930
use Illuminate\Filesystem\FilesystemManager;
3031
use Illuminate\Http\Request;
32+
use Illuminate\Log\Context\Repository as ContextRepository;
3133
use Illuminate\Log\LogManager;
3234
use Mockery as m;
35+
use Mockery\MockInterface;
3336
use PHPUnit\Framework\TestCase;
3437
use Psr\Log\LoggerInterface;
3538

@@ -215,6 +218,20 @@ public function testRouteParameterAttribute()
215218
$container->make(RouteParameterTest::class);
216219
}
217220

221+
public function testContextAttribute(): void
222+
{
223+
$container = new Container;
224+
225+
$container->singleton(ContextRepository::class, function () {
226+
$context = m::mock(ContextRepository::class);
227+
$context->shouldReceive('get')->once()->with('foo', null)->andReturn('foo');
228+
229+
return $context;
230+
});
231+
232+
$container->make(ContextTest::class);
233+
}
234+
218235
public function testStorageAttribute()
219236
{
220237
$container = new Container;
@@ -425,6 +442,13 @@ public function __construct(#[Config('foo')] string $foo, #[Config('bar')] strin
425442
}
426443
}
427444

445+
final class ContextTest
446+
{
447+
public function __construct(#[Context('foo')] string $foo)
448+
{
449+
}
450+
}
451+
428452
final class DatabaseTest
429453
{
430454
public function __construct(#[Database('foo')] Connection $foo, #[Database('bar')] Connection $bar)

0 commit comments

Comments
 (0)