laravel / ideas

Issues board used for Laravel internals discussions.
938 stars 31 forks source link

Set property to a config value via an Attribute #2662

Open KKSzymanowski opened 3 years ago

KKSzymanowski commented 3 years ago

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)
    {
    
    }
    }
  2. 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;
  3. 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 commented 2 years ago

@taylorotwell Can I get your opinion about this?