Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用PHP-DI定义而不是Slim 3中IoC内置的雄辩胶囊管理器?_Php_Laravel_Events_Slim_Slim 3 - Fatal编程技术网

是否可以使用PHP-DI定义而不是Slim 3中IoC内置的雄辩胶囊管理器?

是否可以使用PHP-DI定义而不是Slim 3中IoC内置的雄辩胶囊管理器?,php,laravel,events,slim,slim-3,Php,Laravel,Events,Slim,Slim 3,我目前正在开发一个slim 3应用程序,该应用程序使用桥接来服务依赖项。控制器中的一切都在完美地工作,然而,我在尝试向模型观察者添加依赖项时遇到了一个问题。Eloquents capsule manager有自己的容器,因此我无法通过依赖项(未注入)而不抛出错误 当前设置: $app = new \App\App; // extends \DI\Bridge\Slim\App $container = $app->getContainer(); $capsule = new Capsul

我目前正在开发一个slim 3应用程序,该应用程序使用桥接来服务依赖项。控制器中的一切都在完美地工作,然而,我在尝试向模型观察者添加依赖项时遇到了一个问题。Eloquents capsule manager有自己的容器,因此我无法通过依赖项(未注入)而不抛出错误

当前设置:

$app = new \App\App; // extends \DI\Bridge\Slim\App
$container = $app->getContainer();

$capsule = new Capsule;
$capsule->addConnection($settings['settings']['db']);
$capsule->setEventDispatcher(new Dispatcher());
$capsule->setAsGlobal();
$capsule->bootEloquent();

// Sale model extends eloquent model
Sale::observe(new SaleObserver($container));
class SaleObserver {

    protected $container;

    public function __construct($container){
        $this->container = $container;
    }
    public function saving(Sale $sale){

        // Mail logic using container

    }

}
Unresolvable dependency resolving [Parameter #0 [ <required> $container ]]
Uncaught ArgumentCountError: Too few arguments to function
SaleObserver类:

$app = new \App\App; // extends \DI\Bridge\Slim\App
$container = $app->getContainer();

$capsule = new Capsule;
$capsule->addConnection($settings['settings']['db']);
$capsule->setEventDispatcher(new Dispatcher());
$capsule->setAsGlobal();
$capsule->bootEloquent();

// Sale model extends eloquent model
Sale::observe(new SaleObserver($container));
class SaleObserver {

    protected $container;

    public function __construct($container){
        $this->container = $container;
    }
    public function saving(Sale $sale){

        // Mail logic using container

    }

}
Unresolvable dependency resolving [Parameter #0 [ <required> $container ]]
Uncaught ArgumentCountError: Too few arguments to function
这给了我SaleObserver触发的错误:

$app = new \App\App; // extends \DI\Bridge\Slim\App
$container = $app->getContainer();

$capsule = new Capsule;
$capsule->addConnection($settings['settings']['db']);
$capsule->setEventDispatcher(new Dispatcher());
$capsule->setAsGlobal();
$capsule->bootEloquent();

// Sale model extends eloquent model
Sale::observe(new SaleObserver($container));
class SaleObserver {

    protected $container;

    public function __construct($container){
        $this->container = $container;
    }
    public function saving(Sale $sale){

        // Mail logic using container

    }

}
Unresolvable dependency resolving [Parameter #0 [ <required> $container ]]
Uncaught ArgumentCountError: Too few arguments to function
我最终得到了一个不同的错误,这表明PHPDI自动连接不能与未连接到路由的类一起工作,即使自动连接被设置为true,因为注入的参数没有自动实例化

这显示错误:

$app = new \App\App; // extends \DI\Bridge\Slim\App
$container = $app->getContainer();

$capsule = new Capsule;
$capsule->addConnection($settings['settings']['db']);
$capsule->setEventDispatcher(new Dispatcher());
$capsule->setAsGlobal();
$capsule->bootEloquent();

// Sale model extends eloquent model
Sale::observe(new SaleObserver($container));
class SaleObserver {

    protected $container;

    public function __construct($container){
        $this->container = $container;
    }
    public function saving(Sale $sale){

        // Mail logic using container

    }

}
Unresolvable dependency resolving [Parameter #0 [ <required> $container ]]
Uncaught ArgumentCountError: Too few arguments to function

不幸的是,我正在使用的桥接器看起来像是Laravel的数据库事件处理机制严重依赖于Laravel的容器实现。阅读后,我设法使事件按预期进行

我设置了
\illumb\Container\Container
的一个实例,并将其添加到我的应用程序容器(
$Container
)中并将其使用。此Laravel容器实例将仅用于处理事件。现在,我可以设置
\illumb\Events\Dispatcher
的实例,并将其注册到设置管理器实例:

$container['laravel-container'] = function ($c){
    return new \Illuminate\Container\Container;
};

$container['database-event-dispatcher'] = function ($c) {
    return new \Illuminate\Events\Dispatcher($c['laravel-container']);
};

$capsule = new \Illuminate\Database\Capsule\Manager();
$capsule->addConnection($container['settings']['db']);
// Pass event dispatcher instance from application container
$capsule->setEventDispatcher($container['database-event-dispatcher']);
$capsule->setAsGlobal();
// Now that we're using events it is important to call $capsule->bootEloquent();
$capsule->bootEloquent();
$container ['mailer'] = function ($c) {
    // set up and return a MailerInterface
};

Sale::observe(new SaleObserver($container['mailer']));
A当创建观察者的新实例时,我们可以传递应用程序
$container
,或者只传递观察者中需要的对象

因此,假设这是我们的
SaleObserver
类:

class SaleObserver {

    protected $mail;

    public function __construct(MailerInterface $mail){
        $this->mail = $mail;
    }

    public function updating(Sale $sale){
        // Send Mail logic
    }

}
我们应该给它一个mailer实例:

$container['laravel-container'] = function ($c){
    return new \Illuminate\Container\Container;
};

$container['database-event-dispatcher'] = function ($c) {
    return new \Illuminate\Events\Dispatcher($c['laravel-container']);
};

$capsule = new \Illuminate\Database\Capsule\Manager();
$capsule->addConnection($container['settings']['db']);
// Pass event dispatcher instance from application container
$capsule->setEventDispatcher($container['database-event-dispatcher']);
$capsule->setAsGlobal();
// Now that we're using events it is important to call $capsule->bootEloquent();
$capsule->bootEloquent();
$container ['mailer'] = function ($c) {
    // set up and return a MailerInterface
};

Sale::observe(new SaleObserver($container['mailer']));

可以将
连接
对象与空的Laravel容器一起使用,如下所示:

use Illuminate\Database\Connection;
use Illuminate\Database\Connectors\ConnectionFactory;
use Psr\Container\ContainerInterface as Container;

$container[Connection::class] = function (Container $container) {
    $settings = $container->get('settings');
    $config = [
        'driver' => 'mysql',
        'host' => $settings['db']['host'],
        'database' => $settings['db']['database'],
        'username' => $settings['db']['username'],
        'password' => $settings['db']['password'],
        'charset' => $settings['db']['charset'],
        'collation' => $settings['db']['collation'],
        'prefix' => '',
    ];

    $factory = new ConnectionFactory(new \Illuminate\Container\Container());
    $connection = $factory->make($config);

    // Disable the query log to prevent memory issues
    $connection->disableQueryLog();

    return $connection;
};

也许你需要键入提示类/接口名,这样PHP-DI可以自动连接它们。我更新了我的问题以反映你的输入,这实际上是我尝试的第一件事,我不相信PHP DI/slim bridge会注意到任何未连接到路由请求的类。