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" 中渲染。
请原谅我不知道我所要求的术语是什么。我不太清楚你会怎么称呼它,所以请耐心等待。
在 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" 中渲染。