Laravel 4 / 5:使用HTML视图自动使“返回模型”


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

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

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

$book = Sentry::getUser()->books()->find(14);
return View::make( "books.show" )->withBook($book);

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

你问的很有道理。然而,它并不符合拉拉维尔的世界观——所以请记住,你有点像自己出击。

当你

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

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

return '<p>Foo</p>';

Laravel将渲染HTML片段。

如果你尝试使用常规的PHP对象,

$o = SomeObject;
return $o;

你会看到这样的错误

响应内容必须是实现给定的 __toString() "对象"的字符串或对象。

发生此错误是因为Laravel尝试将返回的对象视为字符串,并且PHP没有将对象呈现为字符串的默认方式

PHP

确实有一种方法,让你(程序员)告诉它(PHP)如果某些代码(Laravel)将对象视为字符串,PHP应该如何呈现该对象。如果将 __toString 方法添加到任何对象,则 PHP 将使用此方法为对象呈现字符串。 尝试以下小程序

<?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;

所以 -- 这意味着你可以在任何对象中嵌入渲染视图的逻辑。 假设您的图书类名为 Book ,请尝试以下操作

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

然后在路由关闭/控制器操作中

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

记住的一件事 - 由于只能有一个__toString定义,如果你正在扩展实现__toString的类,你可能会破坏其他人的功能。 为了避免这种情况,请尝试使用某种条件渲染。

希望对您有所帮助!

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