Laravel 5.1 flash消息处理


Laravel 5.1 flash message handling

在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生成的控制器。

如果您查看storeupdate的方法定义,您将发现参数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">&times;</button>
  <h4>Success</h4>
  @if(is_array($message))
   @foreach ($message as $m)
    {{ $m }}
   @endforeach
  @else
   {{ $message }}
  @endif
 </div>
@endif