Laravel 5 - 奇怪的行为我正在试图理解

时间:2016-01-08 09:44:52

标签: php laravel-5

只是想了解一些事情。一个项目可以有很多文档。在文档控制器中,我在create函数中执行此操作:

public function create(Project $project)
{
    $documents = Document::all();
    $documentLink = $_GET['documentType'];

    $document = Helper::findInCollection($documents, "name", $documentLink);

    dd($document);

    if ($document) {
        return View::make($documentLink.'Doc.edit', compact('project', 'document'));
    } 
}

所以我基本上得到了所有的文件。然后我得到我目前正在处理的文件。然后我将其传递给该文档的编辑视图。 dd向我显示正确的文档,所以这很好。

在该文档的编辑视图中,如果我这样做,我也会看到我想要的正确文档

{{ $document }}

所以我知道我有正确的Document。此编辑页面的表单模型是

{!! Form::model($project->document, [
    'class'=>'form-horizontal',
    'method' => 'PATCH',
    'route' => ['projects.documents.update', $project, $document]
]) !!}

所以我通过路线我的Project模型和我的Document模型。现在我假设$document将是我正在处理的文件。

但是,在更新功能中,如果我这样做

public function update(Project $project, Document $document)
{
    dd($document);

    return null;
}

输出空Document。但是,如果我从函数参数中删除Document的类型提示,它会输出我正在处理的文档的id

为什么会出现这种情况?为什么传递Document输出一个空文档,但删除它只显示当前Document的ID。

任何赞赏的信息。

由于

1 个答案:

答案 0 :(得分:1)

  

它输出一个空文档。但是,如果我从函数参数中删除Document,它会输出我正在处理的文档的id。

     

为什么会出现这种情况?为什么传递Document输出一个空文档,但删除它只显示当前Document的id。

简单回答是reflection,而Laravels非常精彩Service Container

通过类型提示Document $document Laravel将从容器中为您构建一个新的Document实例。

如果没有类型提示,您的路线会定义如下内容:假设您将模型Document绑定到文档路径。

/document/update/{document}

此外,Laravel将始终作为第一个参数发送Request对象。