notrab / dumbo

A lightweight, friendly PHP framework for HTTP.
143 stars 15 forks source link

Proposal: Context Class #47

Open rayblair06 opened 1 week ago

rayblair06 commented 1 week ago

Opening this up for discussion: what do you all think about the idea of introducing class instantiation directly into the context, like $context->get(Foo::class, 'bar')? I think this could be a really cool addition, but I also realize we might be edging toward implementing a service container. Not sure if that's necessarily a bad thing—thoughts?

I have some code below, but feel free to pull my branch here for a demo.

$app = new Dumbo();

class SimpleMessage
{
    public function __construct(
        public string $messageOne,
        public string $messageTwo
    ) {}

    public function getMessage(): string
    {
        return "{$this->messageOne} {$this->messageTwo}";
    }
}

class InjectedMessage
{
    public function __construct(public SimpleMessage $message)
    {}

    public function getInjectedMessage(): string
    {
        return "{$this->message->getMessage()} This is an injected class.";
    }
}

// Context middleware for all routes
$app->use(function ($context, $next) {
    $context->set(SimpleMessage::class, "Hello", "Dumbo!");
    $context->set(
        InjectedMessage::class,
        new SimpleMessage('Hello', 'Dumbo!')
    );

    return $next($context);
});

$app->get("/", function ($context) {
    $messageClass = $context->get(SimpleMessage::class);
    $message = $messageClass->getMessage();

    return $context->json([
        "message" => $message,
    ]);
});

$app->get("/injection", function ($context) {
    $injectedClass = $context->get(InjectedMessage::class);
    $message = $injectedClass->getInjectedMessage();

    return $context->json([
        "message" => $message,
    ]);
});
josephajibodu commented 1 week ago

Looks like a cool addition though.

Are there use cases when this might prove very useful for instantiating the class the normal way?