<?php
use
app\Models\user;
test(
'Action'
,
function
() {
app()->singleton(ClassInterface::
class
, T1Impl::
class
);
$out1
= app(ClassInterface::
class
)();
$this
->assertEquals(
"T1?"
,
$out1
);
app()->bind(ClassInterface::
class
, T2Impl::
class
);
$out2
= app(ClassInterface::
class
)();
$this
->assertEquals(
"T2!"
,
$out2
);
app()->bind(T1Impl::
class
, T2Impl::
class
);
$out3
= app(T1Impl::
class
)();
$this
->assertEquals(
"T2!"
,
$out3
);
app()->bind(T2Impl::
class
, T3Impl::
class
);
app()->bind(T1Impl::
class
, T2Impl::
class
);
app()->singleton(ClassInterface::
class
, T1Impl::
class
);
$out4
= app(ClassInterface::
class
)();
$this
->assertEquals(
"T3!"
,
$out4
);
$user
= User::factory()->create([
'name'
=>
'Tomas'
]);
$out5
= app(T4::
class
, [
'user'
=>
$user
])();
$this
->assertEquals(
"Tomas"
,
$out5
);
});
interface
ClassInterface {
public
function
__invoke();
}
class
T1Impl
implements
ClassInterface {
public
function
__invoke() {
return
"T1?"
;
}
}
class
T2Impl
implements
ClassInterface {
public
function
__invoke() {
return
"T2!"
;
}
}
class
T3Impl
implements
ClassInterface {
public
function
__invoke() {
return
"T3!"
;
}
}
class
T4 {
public
function
__construct(
public
User
$user
){}
public
function
__invoke() {
return
$this
->user->name;
}
}