Skip to content

Proposal: Context Class #47

Description

@rayblair06

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,
    ]);
});

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions