你问的有道理。然而,它并不真正符合 Laravel 的世界观——所以请记住,你有点靠自己。
当你
return View::make( "books.show" )->withBook($book);
从路由闭包或控制器动作中,Laravel 将返回的 anything 视为视图。这包括常规字符串——也就是说,你可以做类似的事情
return '<p>Foo</p>';
Laravel 会渲染 HTML 片段。
如果您尝试使用常规 PHP 对象,
$o = SomeObject;
return $o;
你会看到类似这样的错误
响应内容必须是实现__toString()的字符串或对象,“object”给定。
出现这个错误是因为 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 的类,您可能会破坏其他人的功能。为避免这种情况,请尝试使用某种条件渲染。
希望有帮助!
更新。根据下面的 cmets。我无法对 Accepts 标头说话,尽管我的直觉认为 Laravel 不会这样做,因为 PHP 中没有查看 Accepts 标头的文化。我可能是错的。至于在__toString 中自己使用它,我也不会这样做——如果用户在接受 JSON 请求期间使用您的对象,但由于某种原因需要将其呈现为非 JSON 字符串,您的代码会干扰接着就,随即。最好给你对象渲染上下文,然后渲染你的对象的人选择它在路由关闭、控制器操作或渲染方法本身的“IoCrewrite”中的渲染方式。