我正在将我的项目从CodeIgniter3升级到CodeIgniter 4,我试图在视图中显示flashdata消息,但不幸的是,我尝试的每种方法都会出现不同的错误。
在CodeIgniter3中,我曾经称之为:
<?php if ($this->session->flashdata('message')) : ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<?php echo $this->session->flashdata('message'); ?>
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
</div>
<?php endif; ?>
我在CodeIgniter 4中尝试了同样的方法,但我得到了这个错误:
ErrorException
Undefined property: CodeIgniterViewView::$session
有人能告诉我如何做到这一点吗?提前谢谢。
您可以直接使用session((函数:
<?php if (session()->getFlashdata('message') !== NULL) : ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<?php echo session()->getFlashdata('message'); ?>
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
</div>
<?php endif; ?>
上下文($this(是View类的实例-->您不能直接访问会话实例
您可以在下面创建新实例
$session = ConfigServices::session();
在CodeIgniter 4中,设置Flash数据$session->setFlashdata('item', 'value');
和查看$session->getFlashdata('item');
的新方法
你可以在这里查看:在CodeIgniter 中设置会话中的Flash数据
我只是用另一种方式来显示flashdata,它工作得很好。
在我的控制器中,我为传递到视图的数据添加了一个新索引:
$data['message'] = "Sorry, you must login first";
return view('login', $data);
然后在视图login.php
中,我这样称呼它:
<?php if (isset($message)) : ?>
<div class="alert alert-warning alert-dismissible fade show" role="alert">
<?php echo $message; ?>
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
</div>
<?php endif; ?>
更新:
我只使用了markAsFlashdata()
方法,它非常有效。以下是我在return
方法之前在控制器中所做的操作:
$_SESSION['error'] = 'Sorry, you must login first';
$session = session();
$session->markAsFlashdata('error');
然后在视图中,我使用$_SESSION['error']
:访问flash数据
<?php if (isset($_SESSION['error'])): ?>
<div class="alert alert-warning" role="alert">
<?= $_SESSION['error']; ?>
</div>
<?php endif;?>
在echo $this->section('content');
之后添加此行
$session = ConfigServices::session();
<?php if (isset($message)) : ?>
<div class="alert alert-warning alert-dismissible fade show" role="alert">
<?php echo $message; ?>
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
</div>
<?php endif; ?>
目前,我的解决方案是在BaseController.php中创建一个视图方法。这个想法是添加更多的";普通的";信息到$data数组中。
/* In BaseController.php */
/**
* view function replaced
*/
public function view(string $name, array $data = [], array $options = []): string
{
// Inject global data
$data = array_merge($data,["controller" => $this]);
return view($name,$data,$options);
}
/**
* Temporary message
*/
public function flash($message, $type = 'info') {
$this->session->setFlashdata('flash_message',
["message" => $message, "type" => $type]);
}
public function getFlash() {
return $this->session->getFlashdata('flash_message');
}
/* In the descendant controller */
return $this->view('products/list',['products' => $products]);
/* In the view */
<div id="messages">
<?php if($flash = $controller->getFlash()) : ?>
<?= view_cell('Base::alert', $flash); ?>
<?php endif ?>
</div>