2 回答
TA贡献1880条经验 获得超4个赞
独立使用依赖注入:
安装包:
composer require symfony/dependency-injection
在配置文件中定义您的服务(即src/Resources/config/services.yaml)。例子:
services:
_defaults:
autowire: true
autoconfigure: true
public: false
App\Services\MyService:
class: App\Services\MyService
public: true
您还可以使用服务自动导入功能https://symfony.com/doc/current/service_container.html#importing-many-services-at-once-with-resource
使用以下代码编译 DI 容器:
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
$container = new ContainerBuilder();
$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/src/Resources/config'));
$loader->load('services.yaml');
$container->compile();
将此容器实例注入到您的应用程序中。或者扩展该类ContanerBuilder并使其成为单例。
应用程序中使用的服务应该是公共的,因此您可以直接从容器中获取它们:
$service = $container->get(\App\Services\MyService::class);
您还可以默认公开所有服务:
services:
_defaults:
public: true
TA贡献1995条经验 获得超2个赞
我有一个在所有页面上加载的配置,这是我复制引导逻辑并加载内核的地方:
// ***** legacy config code above
// This probably could just be loaded using require, but kept it here for completeness
if (is_array($env = @include dirname(__DIR__).'/.env.local.php')) {
foreach ($env as $k => $v) {
$_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && 0 !== strpos($k, 'HTTP_') ? $_SERVER[$k] : $v);
}
} elseif (!class_exists(Dotenv::class)) {
throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.');
} else {
// load all the .env files
(new Dotenv(false))->loadEnv(dirname(__DIR__).'/config/.env');
}
$_SERVER += $_ENV;
$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev';
$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'dev' == $_SERVER['APP_ENV'];
$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0';
// End Symfony's bootstrap
// Load Symfony's kernel
$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
$kernel->boot();
从那里我可以访问我想要的特定服务 - 只要它是公开的:
global $kernel;
$service = $kernel->getContainer()->get(\App\Services\MyService::class);
让这个项目在我的项目中运行良好的真正想法不是将所有服务设置为公共,而是创建一个遗留服务,该服务是在 services.yaml 中手动定义并设置为公共的:
services:
App\Services\Legacy\AWSLegacy:
public: true
AWSLegacy 看起来像:
namespace App\Services\Legacy;
use App\Services\AWS\S3;
class AWSLegacy
{
/** @var S3 */
public $s3;
public function __construct(
S3 $s3
)
{
$this->s3 = $s3;
}
}
这使我能够将我想要在旧应用程序中使用的类似服务分组在一起,而无需在 services.yaml 中为每个服务手动创建引用并将其设置为公共。
Symfony 桥接方法对我不起作用,因为我不希望 Symfony 在我的旧应用程序中处理路由(请求和响应),我只想访问新服务。
- 2 回答
- 0 关注
- 121 浏览
添加回答
举报