第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

將 Symfony 的依賴注入(自動(dòng)裝配)集成到遺留應(yīng)用程序中

將 Symfony 的依賴注入(自動(dòng)裝配)集成到遺留應(yīng)用程序中

PHP
函數(shù)式編程 2023-07-21 16:17:43
我有一個(gè)遺留應(yīng)用程序,它是基于舊的自定義 MVC 框架構(gòu)建的,我希望最終放棄該框架。這個(gè)框架不依賴于單個(gè)前端控制器,因此大多數(shù)頁面仍然有專用的php文件來調(diào)用受人尊敬的控制器,其他頁面是混合的php/html。我已經(jīng)閱讀了有關(guān)使用各種方法將應(yīng)用程序遷移到 symfony 的內(nèi)容(https://symfony.com/doc/current/migration.html),但是我在使用這兩種方法時(shí)都遇到了問題,并且意識(shí)到我實(shí)際上并不需要 symfony 的路由處理。Symfony 目前存在于我們的應(yīng)用程序中,但僅由各種命令使用。我們所有的核心邏輯仍然在遺留應(yīng)用程序中,因此 Symfony 可以毫無問題地訪問它,因?yàn)檫@些類都在全局命名空間中。然而,問題是,遺留應(yīng)用程序無法使用任何新的 Symfony 類,因?yàn)樗恢С忠蕾図?xiàng)注入。為了開始將我們的一些核心邏輯和功能轉(zhuǎn)移到 Symfony,需要這種能力。理想情況下,我希望能夠完成的是將容器加載到我們的遺留應(yīng)用程序中,該應(yīng)用程序具有所有可用的自動(dòng)裝配服務(wù)。允許我在舊應(yīng)用程序中訪問基于 Symfony 的新服務(wù)。非常感謝任何幫助。非常感謝。更新1所以我嘗試了@Cerad所說的,只需訪問內(nèi)核,因?yàn)樗侨值摹N覍?bootstrap.php 邏輯復(fù)制到舊應(yīng)用程序的主配置(因此它加載現(xiàn)有的 .env* 文件),然后啟動(dòng)內(nèi)核(實(shí)例化它并在舊配置中調(diào)用 boot)。它有效,我可以在我的 php 文件中引用 $kernel (使用全局 $kernel)并訪問容器。然而,這與@Dmitry Solovov 的回應(yīng)一致,服務(wù)必須是公開的。我必須將所有我想要的服務(wù)設(shè)為公開嗎?如果我在 services.yaml 中手動(dòng)定義服務(wù),將其設(shè)置為公共,它就可以工作。但這并不是很理想,因?yàn)槲蚁胱詣?dòng)加載我的服務(wù),因此我可以以正確的方式使用服務(wù),而不必顯式定義我希望在舊應(yīng)用程序中可用的每項(xiàng)服務(wù)。如何在不公開服務(wù)的情況下將服務(wù)注入到我的舊控制器中?就像 Symfony 的控制器如何允許您將服務(wù)注入到 Controller 方法中一樣?多謝。
查看完整描述

2 回答

?
慕村225694

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


查看完整回答
反對(duì) 回復(fù) 2023-07-21
?
拉風(fēng)的咖菲貓

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ù)。



查看完整回答
反對(duì) 回復(fù) 2023-07-21
  • 2 回答
  • 0 關(guān)注
  • 174 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)