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 關注
- 176 瀏覽
添加回答
舉報