request->all() 和 $request->all() 的区别?

在做教程 02 6.1时遇到的一个问题

在前面一张教程中使用了站长的代码生成器包,但是我个人觉得这样不便于学习,想自己敲一遍好加深印象,但是做到6.1新增话题这一步的时候出现了一个问题

    public function store(TopicRequest $request, Topic $topic)
    {
        $topic->fill($request->all());
        $topic->user_id = Auth::id();
        $topic->save();

        return redirect()->route('topics.show', $topic->id)->with('success', '帖子创建成功!');
    }

这是教程里面的原代码,运行这部分代码时候发生了报错,错误如图

request->all() 和 $request->all() 的区别?

错误中打印的sql语句来看除了 user_id 和两个时间戳字段其他的字段都没有,然而title字段又没有设置默认值,所以报错,但是按照代码逻辑

$topic->fill($request->all());

这一步应该是把提交的参数赋值到了模型,然后我打印了一下$request->all() 和 request->all()的内容

dd($request->all(),request()->all());

[]

["_token" => "TLhFgr02WmQXe3zp1NHWI26854z2kMRJu469ckql"
  "title" => "会返回返回返回"
  "category_id" => "1"
  "body" => "辅导费发的发的发的发的"
]

使用编辑器追踪这个 all 方法,两个追踪到的是同样的代码

    public function all($keys = null)
    {
        $input = array_replace_recursive($this->input(), $this->allFiles());

        if (! $keys) {
            return $input;
        }

        $results = [];

        foreach (is_array($keys) ? $keys : func_get_args() as $key) {
            Arr::set($results, $key, Arr::get($input, $key));
        }

        return $results;
    }

有点懵逼,是我漏了啥步骤吗,还是说 我上面的 $request 是自己创建的 TopicRequest 请求类 代码有问题? TopicRequest 类的代码 我也是按照教程中显示的一样

namespace App\Http\Requests;

use Illuminate\Http\Request;

class TopicRequest  extends Request
{
    public function rules()
    {
        switch($this->method())
        {
            // CREATE
            case 'POST':
                // UPDATE
            case 'PUT':
            case 'PATCH':
            {
                return [
                    'title'       => 'required|min:2',
                    'body'        => 'required|min:3',
                    'category_id' => 'required|numeric',
                ];
            }
            case 'GET':
            case 'DELETE':
            default:
                {
                    return [];
                };
        }
    }

    public function messages()
    {
        return [
            'title.min' => '标题必须至少两个字符',
            'body.min' => '文章内容必须至少三个字符',
        ];
    }
}

有没有大佬解答一下我的疑惑,现在是把 $request->all 换成了 request->all() 解决了问题继续学习下面的部分,但是还是很疑惑这两个有啥区别, 为啥 $request->all 获取不到

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

找到问题所在了,TopicRequest 这个类 继承错了,继承的是

use Illuminate\Http\Request;

换成

 use Illuminate\Foundation\Http\FormRequest;

这个之后问题解决了

但是查看了 FormRequest 这个类里面 继承的基类也是 Illuminate\Http\Request 这个类
难道中间有什么其他实现什么的

<?php

namespace Illuminate\Foundation\Http;

use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Contracts\Container\Container;
use Illuminate\Contracts\Validation\Factory as ValidationFactory;
use Illuminate\Contracts\Validation\ValidatesWhenResolved;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Validation\ValidatesWhenResolvedTrait;
use Illuminate\Validation\ValidationException;

class FormRequest extends Request implements ValidatesWhenResolved
{
  use ValidatesWhenResolvedTrait;
3年前 评论
讨论数量: 3

刚刚发现好像因为 $request->all() 是空的,所以自定义的表单验证类的规则也失效了 :unamused:

3年前 评论

找到问题所在了,TopicRequest 这个类 继承错了,继承的是

use Illuminate\Http\Request;

换成

 use Illuminate\Foundation\Http\FormRequest;

这个之后问题解决了

但是查看了 FormRequest 这个类里面 继承的基类也是 Illuminate\Http\Request 这个类
难道中间有什么其他实现什么的

<?php

namespace Illuminate\Foundation\Http;

use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Contracts\Container\Container;
use Illuminate\Contracts\Validation\Factory as ValidationFactory;
use Illuminate\Contracts\Validation\ValidatesWhenResolved;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Validation\ValidatesWhenResolvedTrait;
use Illuminate\Validation\ValidationException;

class FormRequest extends Request implements ValidatesWhenResolved
{
  use ValidatesWhenResolvedTrait;
3年前 评论

我找到了一点点不一样的地方。 TopicRequest.php这个文件

教程中并没有use Illuminate\Http\Request;

file

但是你的这个文件里面有使用use

至于别的我也看不出来了。。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!