CodeIgniter4-如何在视图中显示Flashdata



我正在将我的项目从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">&times;</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">&times;</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">&times;</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">&times;</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>

相关内容

  • 没有找到相关文章

最新更新