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,并用自定义组件替换使用过的组件
有关应用程序组件的更多信息,请参见。您可以使用自己的“服务层”(其工作原理类似于globalYii::$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最好先提到这些细节。我根据这个更新了答案。