超薄 DI 容器
Slim DI container
我的Slim 3应用索引结构是:
// Instantiate the app
$config = require __DIR__ . '/../src/config.php';
$app = new \Slim\App($config);
// Set up dependencies
require __DIR__ . '/../src/dependencies.php';
// Register middleware
require __DIR__ . '/../src/middleware.php';
// Register routes
require __DIR__ . '/../src/routes.php';
// Run app
$app->run();
我有单独的 worker.php 文件,它通过 bash 脚本执行,这个文件 运行 在后台不间断(监听一些事件)。
如何在我的 worker.php 文件中注入服务,该文件不是 dependencies.php 的 Slim 应用程序或 $container 的一部分,例如我想使用 Monolog 记录器。
依赖项:
$container = $app->getContainer();
/**@var \App\model\Model access to Model methods */
$model = new \App\model\Loan($app->getContainer()->get('settings')['db']);
$container['logger'] = function ($c) {
$settings = $c->get('settings')['logger'];
$logger = new Monolog\Logger($settings['name']);
$logger->pushProcessor(new Monolog\Processor\UidProcessor());
$logger->pushHandler(new Monolog\Handler\StreamHandler($settings['path'], Monolog\Logger::DEBUG));
return $logger;
};
最简单的方法是在 worker.php
中使用相同的 DI 容器
参考:
https://github.com/slimphp/Slim/blob/3.x/Slim/Container.php
$config = require __DIR__ . '/../src/config.php';
$container = new \Slim\Container($config);
require __DIR__ . '/../src/dependencies.php';
你的设置
return [
'settings' => [
'displayErrorDetails' => true,
// 'addContentLengthHeader' => false, // Allow the web server to send the content-length header
// Monolog settings
'logger' => [
'name' => 'slim-app',
'path' => __DIR__ . '/../logs/app.log',
'level' => \Monolog\Logger::DEBUG,
],
],
];
在你的依赖中。
$container['logger'] = function ($c) {
$settings = $c->get('settings')['logger'];
$logger = new Monolog\Logger($settings['name']);
$logger->pushProcessor(new Monolog\Processor\UidProcessor());
$logger->pushHandler(new Monolog\Handler\StreamHandler($settings['path'], Monolog\Logger::DEBUG));
return $logger;
};
您可以使用 Monolog-Cascade 实现此目的,如下所示:
依赖项:
// Configure Monolog with Cascade
$container['logger'] = function ($c) {
Cascade::loadConfigFromArray($c->get('settings')['loggerConfig']);
return Cascade::logger('logger_name_here');
};
然后在你的配置文件中(有 2 个处理程序的例子):
// Monolog-Cascade settings
'loggerConfig' => [
'handlers' => [
// Stdout handler
'console' => [
'class' => 'Monolog\Handler\StreamHandler',
'stream' => 'php://stdout',
'level' => 'DEBUG'
],
// File handler
'file' => [
'class' => 'Monolog\Handler\StreamHandler',
'stream' => __DIR__.'/../../logs/hello.log',
'level' => 'INFO'
]
],
'loggers' => [
'logger_name_here' => [
'handlers' => ['console', 'file']
]
]
]
您可以在配置中添加任意数量的记录器、处理程序、格式化程序、处理器等。 Cascade 将为您设置一切。
[免责声明]:我是Monolog-Cascade
的主要贡献者
我的Slim 3应用索引结构是:
// Instantiate the app
$config = require __DIR__ . '/../src/config.php';
$app = new \Slim\App($config);
// Set up dependencies
require __DIR__ . '/../src/dependencies.php';
// Register middleware
require __DIR__ . '/../src/middleware.php';
// Register routes
require __DIR__ . '/../src/routes.php';
// Run app
$app->run();
我有单独的 worker.php 文件,它通过 bash 脚本执行,这个文件 运行 在后台不间断(监听一些事件)。
如何在我的 worker.php 文件中注入服务,该文件不是 dependencies.php 的 Slim 应用程序或 $container 的一部分,例如我想使用 Monolog 记录器。 依赖项:
$container = $app->getContainer();
/**@var \App\model\Model access to Model methods */
$model = new \App\model\Loan($app->getContainer()->get('settings')['db']);
$container['logger'] = function ($c) {
$settings = $c->get('settings')['logger'];
$logger = new Monolog\Logger($settings['name']);
$logger->pushProcessor(new Monolog\Processor\UidProcessor());
$logger->pushHandler(new Monolog\Handler\StreamHandler($settings['path'], Monolog\Logger::DEBUG));
return $logger;
};
最简单的方法是在 worker.php
中使用相同的 DI 容器参考: https://github.com/slimphp/Slim/blob/3.x/Slim/Container.php
$config = require __DIR__ . '/../src/config.php';
$container = new \Slim\Container($config);
require __DIR__ . '/../src/dependencies.php';
你的设置
return [
'settings' => [
'displayErrorDetails' => true,
// 'addContentLengthHeader' => false, // Allow the web server to send the content-length header
// Monolog settings
'logger' => [
'name' => 'slim-app',
'path' => __DIR__ . '/../logs/app.log',
'level' => \Monolog\Logger::DEBUG,
],
],
];
在你的依赖中。
$container['logger'] = function ($c) {
$settings = $c->get('settings')['logger'];
$logger = new Monolog\Logger($settings['name']);
$logger->pushProcessor(new Monolog\Processor\UidProcessor());
$logger->pushHandler(new Monolog\Handler\StreamHandler($settings['path'], Monolog\Logger::DEBUG));
return $logger;
};
您可以使用 Monolog-Cascade 实现此目的,如下所示:
依赖项:
// Configure Monolog with Cascade
$container['logger'] = function ($c) {
Cascade::loadConfigFromArray($c->get('settings')['loggerConfig']);
return Cascade::logger('logger_name_here');
};
然后在你的配置文件中(有 2 个处理程序的例子):
// Monolog-Cascade settings
'loggerConfig' => [
'handlers' => [
// Stdout handler
'console' => [
'class' => 'Monolog\Handler\StreamHandler',
'stream' => 'php://stdout',
'level' => 'DEBUG'
],
// File handler
'file' => [
'class' => 'Monolog\Handler\StreamHandler',
'stream' => __DIR__.'/../../logs/hello.log',
'level' => 'INFO'
]
],
'loggers' => [
'logger_name_here' => [
'handlers' => ['console', 'file']
]
]
]
您可以在配置中添加任意数量的记录器、处理程序、格式化程序、处理器等。 Cascade 将为您设置一切。
[免责声明]:我是Monolog-Cascade
的主要贡献者