2 回答

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊
獨(dú)立使用依賴注入:
安裝包:
composer require symfony/dependency-injection
在配置文件中定義您的服務(wù)(即src/Resources/config/services.yaml)。例子:
services:
_defaults:
autowire: true
autoconfigure: true
public: false
App\Services\MyService:
class: App\Services\MyService
public: true
您還可以使用服務(wù)自動(dòng)導(dǎo)入功能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();
將此容器實(shí)例注入到您的應(yīng)用程序中?;蛘邤U(kuò)展該類ContanerBuilder并使其成為單例。
應(yīng)用程序中使用的服務(wù)應(yīng)該是公共的,因此您可以直接從容器中獲取它們:
$service = $container->get(\App\Services\MyService::class);
您還可以默認(rèn)公開所有服務(wù):
services:
_defaults:
public: true

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
我有一個(gè)在所有頁面上加載的配置,這是我復(fù)制引導(dǎo)邏輯并加載內(nèi)核的地方:
// ***** 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();
從那里我可以訪問我想要的特定服務(wù) - 只要它是公開的:
global $kernel;
$service = $kernel->getContainer()->get(\App\Services\MyService::class);
讓這個(gè)項(xiàng)目在我的項(xiàng)目中運(yùn)行良好的真正想法不是將所有服務(wù)設(shè)置為公共,而是創(chuàng)建一個(gè)遺留服務(wù),該服務(wù)是在 services.yaml 中手動(dòng)定義并設(shè)置為公共的:
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;
? ? }
}
這使我能夠?qū)⑽蚁胍谂f應(yīng)用程序中使用的類似服務(wù)分組在一起,而無需在 services.yaml 中為每個(gè)服務(wù)手動(dòng)創(chuàng)建引用并將其設(shè)置為公共。
Symfony 橋接方法對(duì)我不起作用,因?yàn)槲也幌M?Symfony 在我的舊應(yīng)用程序中處理路由(請(qǐng)求和響應(yīng)),我只想訪問新服務(wù)。
- 2 回答
- 0 關(guān)注
- 174 瀏覽
添加回答
舉報(bào)