ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Set property to a config value via an Attribute

Open KKSzymanowski opened this issue 3 years ago • 1 comments

Ability to set a property of an object to some config value when the object is constructed by the Container. API would look something like this:

class FooController extends Controller
{
    #[Config('app.url')]
    protected $appUrl;

    #[Config('foo.bar', 'some default value')]
    protected $fooBar;
}

Proof of concept:

  1. Create a Config attribute:
#[Attribute(Attribute::TARGET_PROPERTY)]
class Config {
    public function __construct($key, $default = null)
    {

    }
}
  1. Change the last line in Illuminate\Container\Container::build()
- return $reflector->newInstanceArgs($instances);
+ $object = $reflector->newInstanceArgs($instances);
+ 
+ foreach($reflector->getProperties() as $property) {
+     foreach($property->getAttributes() as $attribute) {
+         if($attribute->getName() == Config::class) {
+             $property->setAccessible(true);
+             $property->setValue($object, call_user_func_array('config', $attribute->getArguments()));
+         }
+     }
+ }
+ 
+ return $object;
  1. Use the Attribute in a controller and see that the property value has been set to a value from app configuration.

What do you think?

KKSzymanowski avatar Jul 08 '21 12:07 KKSzymanowski

@taylorotwell Can I get your opinion about this?

KKSzymanowski avatar Jul 14 '21 09:07 KKSzymanowski