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

Posted

技术标签:

【中文标题】Laravel 4 / 5:使`return Model`自动使用HTML视图【英文标题】:Laravel 4 / 5: Make `return Model` automatically use HTML view 【发布时间】:2015-03-14 16:37:48 【问题描述】:

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

在 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 将如何知道您是返回一个变量还是返回整个模板?您需要调整大量核心文件才能使其正常工作。 【参考方案1】:

你问的有道理。然而,它并不真正符合 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”中的渲染方式。

【讨论】:

这很酷。出于某种原因,我认为 Laravel 会查看 Accepts 标头并自动确定要返回的内容,无论是 JSON 还是视图对象。看到你有很多经验,你认为只有在正确的Accepts 标头存在的情况下,覆盖__toString() 方法是否安全? @Goldentoa11 更新了问题,增加了一些想法。祝你好运!

以上是关于Laravel 4 / 5:使`return Model`自动使用HTML视图的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4 - 如何在 javascript 加载之前使 @section 屈服

雄辩的关系,模型的链接(Laravel 5.4)

Laravel 5:用户关注其他用户(如twitter) - 如何设置关系

Laravel之路由

5 个 Laravel Eloquent 小技巧

在 Laravel 5.4 中更新数据透视表 [重复]