Laravel 4 / 5: 使 `return 模型` 自动使用 HTML 视图

Laravel 4 / 5: Make `return Model` automatically use HTML view

请原谅我不知道我所要求的术语是什么。我不太清楚你会怎么称呼它,所以请耐心等待。

在 Laravel 4 或 5 中,有什么方法可以为 Eloquent 模型设置默认模板吗?很长一段时间以来,我一直在写这样的台词:(仅以书籍系统为例)

$book = Sentry::getUser()->books()->find(14);

return View::make( "books.show" )->withBook($book);

有什么方法可以让 return $book; 扩展为 return View::make( "books.show" )->withBook($book); 吗?

你问的有道理。然而,它并不真正符合 Laravel 的世界观——所以请记住,你有点靠自己出击了。

当你

return View::make( "books.show" )->withBook($book);

从路由关闭或控制器操作中,Laravel 将 任何返回的东西 视为视图。这包括常规字符串——即,您可以执行类似

的操作
return '<p>Foo</p>';

和 Laravel 将呈现 HTML 片段。

如果您尝试使用常规 PHP object、

$o = SomeObject;
return $o;

你会看到类似这样的错误

The Response content must be a string or object implementing __toString(), "object" given.

发生此错误是因为 Laravel 已尝试将返回的 object 视为字符串,而 PHP 没有呈现 [=79= 的默认方式] 作为字符串.

PHP 有什么是你(程序员)告诉它(PHP)如何PHP的方法如果某些代码 (Laravel) 将 object 视为字符串,则应呈现 object。如果您将 __toString 方法添加到任何 object,那么 PHP 将使用此方法为 object 呈现字符串。试试下面的小程序

<?php
class SomeObject
{
    public function __toString()
    {
        return 'I am a rendered SomeObject';
    }
}
$object = SomeObject;
// cast the object as a string ("treat" above)
echo (string) $object;

所以 -- 这意味着您可以在任何 object 中嵌入呈现视图的逻辑。假设您的书 class 名为 Book,请尝试以下操作

class Book
{
    //...
    public function __toString()
    {
        return View::make( "books.show" )->withBook($this);
    }
}

然后在你的路线中closure/controller行动

$book = Sentry::getUser()->books()->find(14);

return $book;

要记住一件事——因为只能有 一个 __toString 定义,如果你扩展 class 实现 __toString, 你可能会破坏别人的功能。为避免这种情况,请尝试使用某种条件渲染。

希望对您有所帮助!

更新。根据下面的评论。我无法与 Accepts header 交谈,尽管我的直觉告诉 Laravel 不会这样做,因为 PHP 中没有查看 Accepts header 的文化。我可能是错的。至于在 __toString 中自己使用它,我也会拒绝——如果用户在接受 JSON 请求期间使用你的 object,但需要将其呈现为非JSON 字符串出于某种原因,您的代码会干扰它。最好给你 object 渲染上下文,然后渲染你的 object 的人选择它如何在路由闭包、控制器操作或渲染方法本身的 "IoCrewrite" 中渲染。