Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii2动态设置组件值_Php_Yii2 - Fatal编程技术网

Php Yii2动态设置组件值

Php Yii2动态设置组件值,php,yii2,Php,Yii2,我正在使用这个图书馆 在控制器中。要在Yi2中的会话帮助下设置此值。在配置中传递依赖于Yii::$app的动态值将不起作用,因为您引用的是应用程序,并且它是使用该配置构造的(组件也是应用程序的一部分),目前不存在。当应用程序初始化并且存在Yii::$app对象时,需要在以后设置它。例如,在控制器或某些自定义组件中 使用库,可以按如下方式执行: use Yii; ... Yii:$app->imap->connection = [ 'imapPath' => '{im

我正在使用这个图书馆


在控制器中。要在Yi2中的会话帮助下设置此值。

在配置中传递依赖于
Yii::$app
的动态值将不起作用,因为您引用的是应用程序,并且它是使用该配置构造的(组件也是应用程序的一部分),目前不存在。当应用程序初始化并且存在
Yii::$app
对象时,需要在以后设置它。例如,在控制器或某些自定义组件中

使用库,可以按如下方式执行:

use Yii;

...

Yii:$app->imap->connection = [
    'imapPath' => '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX',
    'imapLogin' => $imapLogin, // Set this value dynamically
    'imapPassword' => $imapPassword, // Set this value dynamically
    'serverEncoding' => 'encoding', // utf-8 default
    'attachmentsDir' => 'uploads/attachments',
],
然后你需要打电话:

Yii:$app->imap->createConnection();
以正确更新配置

由于该组件的编写方式,无法单独设置
imapLogin
imapPassword
(这些属性受
connection
数组的保护和填充)。如果您想这样做,您必须对这个组件进行子类化,自己编写这些setter,并用自定义组件替换使用过的组件

有关应用程序组件的更多信息,请参见。

您可以使用自己的“服务层”(其工作原理类似于global
Yii::$app
)。只需创建
\yii\di\ServiceLocator
实例:

// Init service layer.
$services = new ServiceLocator();
$services->setComponents([
    'imap' => [
        'class' => 'roopz\imap\Imap',
        'connection' => [
            'imapPath' => '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX',
            'imapLogin' => 'abc@gmail.com',//set this value dynamically
            'imapPassword' => '123',//set this value dynamically
            'serverEncoding' => 'encoding', // utf-8 default.
            'attachmentsDir' => 'uploads/attachments'
        ],
    ],
    // ...
]);


// Retrieving the defined components:
$imap = $services->get('imap');
$imap = $services->imap;
如果
imap
组件将仅使用您的控制器,则可以将
$services
存储为此控制器的受保护/私有属性。 所述方法的工作原理与
Yii::$app
中的常用组件完全类似,因为应用程序类也是ServiceLocator

或者,您可以使用imap实例定义或重新定义组件:

// Init service layer.
$services = new ServiceLocator();
$services->setComponents([
    'imap' => [
        'class' => 'roopz\imap\Imap',
        'connection' => [
            'imapPath' => '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX',
            'imapLogin' => 'abc@gmail.com',//set this value dynamically
            'imapPassword' => '123',//set this value dynamically
            'serverEncoding' => 'encoding', // utf-8 default.
            'attachmentsDir' => 'uploads/attachments'
        ],
    ],
    // ...
]);


// Retrieving the defined components:
$imap = $services->get('imap');
$imap = $services->imap;
// Preparing components
$defaultImapConfig = [
    'connection' => [
        'imapPath'       => '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX',
        'imapLogin'      => null,
        'imapPassword'   => null,
        'serverEncoding' => 'encoding', // utf-8 default.
        'attachmentsDir' => 'uploads/attachments'
    ],
];


// Init service layer.
$services = new ServiceLocator();


// Define component 
$imap = new \roopz\imap\Imap(ArrayHelper::merge($defaultImapConfig, ['connection' => [
    'imapLogin'     => 'abc@gmail.com',
    'imapPassword'  => '123',
]]));

$services->set('imap', $imap);


// Redefine component with new config
$imap = new \roopz\imap\Imap(ArrayHelper::merge($defaultImapConfig, ['connection' => [
    'imapLogin'     => 'dfg@gmail.com',
    'imapPassword'  => '456',
]]));

$services->set('imap', $imap);      // If component definition with the same name already exist, it will be ovewritten.
当然,您可以使用类似的方法在
Yii::$app
中重新定义全局组件,但这是一种糟糕的做法。我建议创建单独的(本地)服务层,可以从控制器、模型等进行访问


您可以找到有关使用服务定位器的更多详细信息。

我在这里找到了可选的php imap库[php imap][1]

[1] :。可以在yii2中使用composer轻松安装。并且可以传递一个动态值

  $mailbox = new PhpImap\Mailbox('{imap.gmail.com:993/imap/ssl}INBOX', 'some@gmail.com', '*********', __DIR__);
  // Read all messaged into an array:
  $mailsIds = $mailbox->searchMailbox('ALL');

请简要说明您需要Yii2的依赖性注入容器,请检查此处:获取此错误PHP致命错误–yii\base\ErrorException无法将roopz\imap\imap类型的对象用作array@SantoshRamKunjir您的问题中不清楚
连接
属性的类型。我更新了答案,希望你明白。@SantoshRamKunjir最好先提到这些细节。我根据这个更新了答案。