闪存消息(Flashing Messages)

闪存消息用于通知用户关于他/她产生的动作状态,或者简单地为用户显示一此信息。 这类消息可以使用这个组件来生成。

适配器(Adapters)

这个组件使用了适配器来定义消息传递给Flasher后的行为:

适配器描述API
Direct直接输出传递给flasher的消息Phalcon\Flash\Direct
Session将消息临时存放于会话中,以便消息可以在后面的请求中打印出来Phalcon\Flash\Session

使用(Usage)

通常闪存消息都是来自服务容器的请求. 如果你正在使用 Phalcon\Di\FactoryDefault , 那么 Phalcon\Flash\Direct 将会作为 “flash” 服务自动注册 和 Phalcon\Flash\Session 将会作为 “flashSession” 服务自动注册. You can also manually register it:

  1. <?php
  2. use Phalcon\Flash\Direct as FlashDirect;
  3. use Phalcon\Flash\Session as FlashSession;
  4. // 建立flash服务
  5. $di->set(
  6. "flash",
  7. function () {
  8. return new FlashDirect();
  9. }
  10. );
  11. // 建立flashSession服务
  12. $di->set(
  13. "flashSession",
  14. function () {
  15. return new FlashSession();
  16. }
  17. );

这样的话,你便可以在控制器或者视图中通过在必要的片段中注入此服务来使用它:

  1. <?php
  2. use Phalcon\Mvc\Controller;
  3. class PostsController extends Controller
  4. {
  5. public function indexAction()
  6. {
  7. }
  8. public function saveAction()
  9. {
  10. $this->flash->success("The post was correctly saved!");
  11. }
  12. }

目前已支持的有四种内置消息类型:

  1. <?php
  2. $this->flash->error("too bad! the form had errors");
  3. $this->flash->success("yes!, everything went very smoothly");
  4. $this->flash->notice("this a very important information");
  5. $this->flash->warning("best check yo self, you're not looking too good.");

你可以用你自己的类型来添加消息:

  1. <?php
  2. $this->flash->message("debug", "this is debug message, you don't say");

输出信息(Printing Messages)

发送给flash服务的消息将会自动格式成html:

  1. <div class="errorMessage">too bad! the form had errors</div>
  2. <div class="successMessage">yes!, everything went very smoothly</div>
  3. <div class="noticeMessage">this a very important information</div>
  4. <div class="warningMessage">best check yo self, you're not looking too good.</div>

正如你看到的,CSS的类将会自动添加到:code:`<div>`中。这些类允许你定义消息在浏览器上的图形表现。 此CSS类可以被重写,例如,如果你正在使用Twitter的Bootstrap,对应的类可以这样配置:

  1. <?php
  2. use Phalcon\Flash\Direct as FlashDirect;
  3. // 利用自定义的CSS类来注册flash服务
  4. $di->set(
  5. "flash",
  6. function () {
  7. $flash = new FlashDirect(
  8. [
  9. "error" => "alert alert-danger",
  10. "success" => "alert alert-success",
  11. "notice" => "alert alert-info",
  12. "warning" => "alert alert-warning",
  13. ]
  14. );
  15. return $flash;
  16. }
  17. );

然后消息会是这样输出:

  1. <div class="alert alert-danger">too bad! the form had errors</div>
  2. <div class="alert alert-success">yes!, everything went very smoothly</div>
  3. <div class="alert alert-info">this a very important information</div>
  4. <div class="alert alert-warning">best check yo self, you're not looking too good.</div>

绝对刷送与会话(Implicit Flush vs. Session)

依赖于发送消息的适配器,它可以立即产生输出,也可以先临时将消息存放于会话中随后再显示。 你何时应该使用哪个?这通常依赖于你在发送消息后重定向的类型。例如, 如果你用了“转发”则不需要将消息存放于会话中,但如果你用的是一个HTTP重定向,那么则需要存放于会话中:

  1. <?php
  2. use Phalcon\Mvc\Controller;
  3. class ContactController extends Controller
  4. {
  5. public function indexAction()
  6. {
  7. }
  8. public function saveAction()
  9. {
  10. // 存储POST
  11. // 使用直接闪存
  12. $this->flash->success("Your information was stored correctly!");
  13. // 转发到index动作
  14. return $this->dispatcher->forward(
  15. [
  16. "action" => "index"
  17. ]
  18. );
  19. }
  20. }

或者使用一个HTTP重定向:

  1. <?php
  2. use Phalcon\Mvc\Controller;
  3. class ContactController extends Controller
  4. {
  5. public function indexAction()
  6. {
  7. }
  8. public function saveAction()
  9. {
  10. // 存储POST
  11. // 使用会话闪存
  12. $this->flashSession->success("Your information was stored correctly!");
  13. // 返回一个完整的HTTP重定向
  14. return $this->response->redirect("contact/index");
  15. }
  16. }

在这种情况下,你需要手动在交互的视图上打印消息:

  1. <!-- app/views/contact/index.phtml -->
  2. <p><?php $this->flashSession->output() ?></p>

“flashSession”属性是先前在依赖注入容器中设置的闪存。 为了能成功使用flashSession消息者,你需要先启动 session