woohoolabs / zen

Woohoo Labs. Zen is a very fast and simple, PSR-11 compliant DI Container & preload file generator.
MIT License
95 stars 6 forks source link

Autowiring class method/passed closure? #13

Open oakleaf opened 1 year ago

oakleaf commented 1 year ago

Hello, Im experimenting with Zen (among other libraries) for finding the perfect DI for my framework. I really can't get my head around how to create the autowiring functionality for a specific method of my "kernel" class.

E.g.

class Kernel{
public function init(\Closure $_callback)
{
return $_callback(); // I want this CB to have autowired classes available
}
}

// Index.php
(new Kernel())->init(function(Request $request){

I have figured out to use EntryPoints in my configuration in order to register which classes that should be autowired, but I can't figure out how to put that into classes & methods like Im trying to explain above. Is it even possible?

kocsismate commented 1 year ago

Hi,

Sorry, I may not get what the exact problem is, but my understanding is that you would like to resolve the Request class as the $request parameter. The simplest solution is to do the following:

class Kernel
{
    private Request $request;

    public function __construct(Request $request) {
        $this->request = $request;
    }

    public function init(\Closure $_callback)
    {
        return $_callback($this->request);
    }
}

// Index.php

$container = new Container(); // Instantiate Zen
$container->get(Kernel::class)->init(function(Request $request){}));