Learning laravel:with

前面在 Learning laravel:视图 中向视图传递数据时提到过 with() 方法:

return view('greeting')->with('name', 'Victoria');

第一个参数是 key, 第二参数是 value,在视图中可以通过 key 获取值: {{ $name }}.

之后在 ArticleController 中, 有如下代码:

<!-- 文件位置 app/Http/Controllers/ArticleController.php -->

public function store(Request $request)
{
    ......

    return redirect('article')->withSuccess('创建文章成功');
}

在之前,我们定义了视图片段 success.blade.php

<!-- 文件位置 resources/layouts/success.blade.php -->

@if (session()->has('success'))
    <div class="alert alert-dismissable alert-success">
        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
        <ul>
            {{ session()->get('success') }}
        </ul>
    </div>
@endif

当文章保存成功时,有如下效果:

但是当在 IDE 中查找 withSuccess() 方法的定义时,却提示找不到:

那么这个方法如何正确运行的呢?

查找框架源码:

<!-- 文件位置 vendor/laravel/framework/src/Illuminate/Http/RedirectResponse.php -->

public function __call($method, $parameters){
    ......

    if (Str::startsWith($method, 'with')) {
        return $this->with(Str::snake(substr($method, 4)), $parameters[0]);
    }

    ......
}

在这个魔术方法中实现的,可知 withSuccess('创建文章成功') 相当于 with('success', '创建文章成功') , 这也是 为什么在视图片段 success.blade.php 中使用 session()->has('success') 判断是否存在,用 session()->get('success') 获取数据, 同样可知,with 方法的数据暂存在 session 中。

在这个文件中可以看到已经封装好的几个函数:withInput()withCookies()withErrors(),可以参考文档 https://d.laravel-china.org/docs/5.5/requestshttps://d.laravel-china.org/docs/5.5/responses 理解。

转载请注明出处:https://www.hellocode.wang/article/learning-laravel-with

评论