zf2中的Flash消息

Din*_*nga 3 session zend-framework2

我怎样才能在zend freamwork 2中使用flash messenger?会话文档还没有.谁知道呢?但会话库就在那里.

rab*_*rab 15

更新:

Zend Framework新版本添加了FlashMessenger View Helper,在路径中找到 /library/Zend/View/Helper/FlashMessenger.php

FlashMessenger.php


老答案:

我编写了一个自定义视图助手,用于打印flash消息

在/module/Application/Module.php中

public function getViewHelperConfig()
{
    return array(                    
        'factories' => array(                                               
            'flashMessage' => function($sm) {      

                 $flashmessenger = $sm->getServiceLocator()
                                      ->get('ControllerPluginManager')
                                      ->get('flashmessenger');                                   

                 $message    = new \My\View\Helper\FlashMessages( ) ;
                 $message->setFlashMessenger( $flashmessenger );

                 return $message ;
               } 
           ),
    );
}
Run Code Online (Sandbox Code Playgroud)

在/library/My/View/Helper/FlashMessages.php中创建自定义视图助手

namespace My\View\Helper;
use Zend\View\Helper\AbstractHelper;

class FlashMessages extends AbstractHelper
{

        protected $flashMessenger;

        public function setFlashMessenger( $flashMessenger )
        {
                $this->flashMessenger = $flashMessenger ;
        }


        public function __invoke( )
        {

                 $namespaces = array( 
                     'error' ,'success', 
                     'info','warning' 
                 );

                 // messages as string
                 $messageString = '';

                 foreach ( $namespaces as $ns ) {

                        $this->flashMessenger->setNamespace( $ns );

                        $messages = array_merge(
                                 $this->flashMessenger->getMessages(),
                                 $this->flashMessenger->getCurrentMessages()
                        );


                        if ( ! $messages ) continue;

                        $messageString .= "<div class='$ns'>"
                                        . implode( '<br />', $messages )
                                    .'</div>';
                }

                return $messageString ;
        }
}
Run Code Online (Sandbox Code Playgroud)

然后从layout.phtml或你的view.phtml简单调用

echo $this->flashMessage(); 
Run Code Online (Sandbox Code Playgroud)

让我举例说明控制器动作

public function testFlashAction()
{
          //set flash message
          $this->flashMessenger()->setNamespace('warning')
                 ->addMessage('Mail sending failed!');

          //set flash message
          $this->flashMessenger()->setNamespace('success')
                 ->addMessage('Data added successfully');

          // redirect to home page 
          return $this->redirect()->toUrl('/');
}
Run Code Online (Sandbox Code Playgroud)

在主页中,它打印

<div class="success">Data added successfully</div>
<div class="warning">Mail sending failed!</div>
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助!


Sam*_*Sam 9

我前段时间写了一篇关于此的帖子.你可以在这里找到它

基本上你像以前一样使用它.

<?php
public function commentAction()
{
    // ... display Form
    // ... validate the Form
    if ($form->isValid()) {
        // try-catch passing data to database

        $this->flashMessenger()->addMessage('Thank you for your comment!');

        return $this->redirect()->toRoute('blog-details'); //id, blabla
    }
}

public function detailsAction()
{
    // Grab the Blog with given ID
    // Grab all Comments for this blog
    // Assign the view Variables

    return array(
        'blog' => $blog,
        'comments' => $comments,
        'flashMessages' => $this->flashMessenger()->getMessages()
    );
}
Run Code Online (Sandbox Code Playgroud)

然后在.phtml文件中,你这样做:

// details.phtml
<?php if(count($flashMessages)) : ?>
<ul>
    <?php foreach ($flashMessages as $msg) : ?>
    <li><?php echo $msg; ?></li>
    <?php endforeach; ?>
</ul>
<?php endif; ?>
Run Code Online (Sandbox Code Playgroud)

显然这不是太方便,因为你必须为每个.phtml文件执行此操作.因此,在布局中执行此操作时,您最多只需执行以下操作:

<?php
// layout.phtml
// First get the viewmodel and all its children (ie the actions viewmodel)
$children = $this->viewModel()
                 ->getCurrent()
                 ->getChildren();

$ourView  = $children[0];

if (isset($ourView->flashMessages) && count($ourView->flashMessages)) : ?>
<ul class="flashMessages">
    <?php foreach ($ourView->flashMessages as $fMessage) : ?>
    <li><?php echo $fMessage; ?></li>
    <?php endforeach; ?>
</ul>
<?php endif; ?>
Run Code Online (Sandbox Code Playgroud)

如果您需要进一步的说明,请参见我的博客,但我想代码本身是相当清楚的(除了frmo的layout.phtml例子).或者,您可以随时自由编写自己的视图帮助程序,使其在视图模板中看起来更清晰.

  • 如果你现在有,那么分享你的代码怎么样?:)我相信这会帮助很多不熟悉它的人.我刚刚列出了"魔术"助手背后的基本工作;) (2认同)