2016-09-21 64 views
1

我使用这个库https://github.com/yiioverflow/yii2-imapYii2集部件值动态

'imap' => [ 
       'class' => 'roopz\imap\Imap', 
       'connection' => [ 
        'imapPath' => '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX', 
        'imapLogin' => '[email protected]',//set this value dynamically 
        'imapPassword' => '123',//set this value dynamically 
        'serverEncoding' => 'encoding', // utf-8 default. 
        'attachmentsDir' => 'uploads/attachments' 
       ], 
      ], 
    //Create imap class object 
    $mailbox = yii::$app->imap->connection; 
    // Read all messaged into an array: 
    $mailsIds = $mailbox->searchMailbox('ALL'); 
在控制器

。想在yii2的会话帮助下设置这个值。

+0

能否请您简要 –

+0

您需要Yii2的扶养注入容器解释,请点击这里:HTTP://计算器。com/questions/32689230/yii2-params-access-within-local-config-file-in-common-directory –

回答

1

我找到其他的PHP-IMAP库这里[PHP IMAP] [1]

[1]:https://github.com/barbushin/php-imap。这可以通过yii2中的作曲家轻松安装。并且可以通过一个动态值

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

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

使用库yiioverflow/yii2-imap它可以这样做:

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(); 

正确更新的配置。

由于写入该组件的方式(这些属性受保护并从connection数组中填充,因此无法单独设置imapLoginimapPassword)。如果你想这样做,你必须继承这个组件并自己编写这些设置器,并用你自定义的组件替换旧组件。

有关应用组件的更多信息,请参见official docs

+0

获取此错误PHP致命错误 - yii \ base \ ErrorException 无法使用roopz \ imap \ Imap类型的对象作为数组 –

+0

@SantoshRamKunjir目前还不清楚你的问题中''connection'属性的类型。我更新了答案,希望你明白了。 – arogachev

+0

我正在使用这个库https://github.com/yiioverflow/yii2-imap –

0

您可以使用自己的“服务层”(与全球的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' => '[email protected]',//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实例重新定义你的组件:

// 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'  => '[email protected]', 
    'imapPassword' => '123', 
]])); 

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


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

$services->set('imap', $imap);  // If component definition with the same name already exist, it will be ovewritten. 

当然,你也可以用类似的方式在Yii::$app重新定义全球的组件,但它是不好的做法。我建议创建单独的(本地)服务层,可以从您的控制器,模型等访问。

有关使用服务定位器的更多详细信息,请参阅here