gpt4 book ai didi

php - 如何将配置的应用程序组件注入(inject)模型实例?

转载 作者:行者123 更新时间:2023-12-04 17:57:11 25 4
gpt4 key购买 nike

我在主题中描述了一个问题。让我解释。我使用基本的应用程序模板。我有简单的模型搜索,它使用应用程序组件 GoogleCustomSearch 通过 Google 自定义搜索 API 进行搜索。 GoogleCustomSearch 必须配置 Google API key 和搜索引擎 ID。我通过应用程序配置 config/web.php 指定 Google API key 和搜索引擎 ID。我想将 GoogleCustomSearch 的已配置实例注入(inject)到搜索模型的实例中。是否有可能以更简洁的方式实现我的目标(下面的解决方法)?

文件:models/Search.php

namespace app\models;

use app\components\GoogleCustomSearch;
use yii\base\Model;

class Search extends Model
{
/** @var GoogleCustomSearch */
protected $googleCustomSearch;

public function __construct(GoogleCustomSearch $googleCustomSearch, array $config = [])
{
$this->googleCustomSearch = $googleCustomSearch;
parent::__construct($config);
}
....
}

文件:components/GoogleCustomSearch.php

namespace app\components;

use yii\base\Component;
use yii\base\InvalidValueException;

class GoogleCustomSearch extends Component
{
public $searchEngineId;
public $apiKey;
...
}

下面是我当前的解决方法

文件:config/bootstrap.php

use app\models\Search;
use yii\di\Container;
use yii\web\Application;

\Yii::$container->set('search', function (Container $container, $params, $config) {
$googleCustomSearch = $container->get(Application::class)->googleCustomSearch;
array_unshift($params, $googleCustomSearch);
return $container->get(Search::class, $params, $config);
});

文件:web/index.php

use yii\web\Application;

....

require (__DIR__ . '/../config/bootstrap.php');
$config = require(__DIR__ . '/../config/web.php');

\Yii::$container
->setSingleton(Application::class, [], [$config])
->get(Application::class)
->run()
;

然后调用

/** @var Search $model */
$model = \Yii::createObject('search');

有没有更简洁的方法将配置的组件注入(inject)对象实例?

最佳答案

  • 你的模型部分很好。它对如何注入(inject)依赖项一无所知,而这是正确的注入(inject)方式。
  • 在 Bootstrap 中,我将设置 GoogleCustomSearch 而不是搜索模型:

    Yii::$container->set(GoogleCustomSearch::class, function (Container $container, $params, $config) { 返回 Yii::$app->googleCustomSearch;});

  • 不确定修改index.php的目的。

关于php - 如何将配置的应用程序组件注入(inject)模型实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39426518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com