在Laravel 5.0和4。*有这个选项来检查会话是否有flash_messages:
控制器:
public function store(Request $request) {
Session::flash('flash_message', 'Success');
return redirect('somepage');
}
然后你可以在布局中调用这个:
@if (Session::has('flash_message'))
<p>{{ Session::get('flash_message') }}</p>
@endif
这个工作得很好,但是在Laravel 5.1中它改变了。现在它被存储在请求变量中。因此,我在控制器中将其更改为:
public function store(Request $request) {
$request->session()->flash('flash_message', 'Success');
return redirect('somepage');
}
我在布局中称之为:
@if($request->session()->has('flash_message'))
<p>{{ $request->session()->get('flash_message') }}</p>
@endif
我正在做的正是Laravel 5.1文档中所述的:
判断会话中是否存在项
has方法可用于检查会话中是否存在项。如果条目存在,该方法将返回true:
if ($request->session()->has('users')) { // }
现在这对于存储方法来说工作得很好,因为我只在那里添加了一个flash_message,但如果我想访问另一个方法,比如index, create, edit等,它会显示这个错误:
ErrorException
未定义变量:request
我理解请求变量没有在其他方法中声明,我可以使用isset($request)
来解决这个if语句。
是否有更好的解决方案来检查我的flash_message是否在$request
变量中设置,如早期版本的Laravel?
听起来你正在使用Laravel生成的控制器。
如果您查看store
和update
的方法定义,您将发现参数Request $request
。通过包含这个,Laravel自动为你创建一个Request
实例。
为了在其他方法中访问它,您有三个选项:
将相同的参数添加到任何其他方法定义中,Laravel将以相同的方式为您生成它。
创建一个构造函数,并将Request
实例赋值给一个属性。
public function __construct(Request $request)
{
$this->request = $request;
}
在类定义之前声明use Session;
,以使Session
类在名称空间中可访问。
您仍然可以使用旧方法:)。最新的laravel只是增加了实现这一目标的新方法。下面是显示错误消息的示例代码,这些错误消息作为flash消息传递到视图页面。
@if ($message = Session::get('success'))
<div class="alert alert-success alert-block">
<button type="button" class="close" data-dismiss="alert">×</button>
<h4>Success</h4>
@if(is_array($message))
@foreach ($message as $m)
{{ $m }}
@endforeach
@else
{{ $message }}
@endif
</div>
@endif
@if ($message = Session::get('success'))
<div class="alert alert-success alert-block">
<button type="button" class="close" data-dismiss="alert">×</button>
<h4>Success</h4>
@if(is_array($message))
@foreach ($message as $m)
{{ $m }}
@endforeach
@else
{{ $message }}
@endif
</div>
@endif