渲染模型时,如何使用 blade 模板而不是默认的 json?

When rendering a model, how to use a blade template instead of json as default?

是否可以将 blade 模板分配给模型?

而不是这样做:

@php $contact = Contact::find(1); @endphp
@include('contact', ['contact' => $contact])

我只想做:

@php $contact = Contact::find(1); @endphp
{{ $contact }}

但后者显然只是吐出了json中的模型。

可以用PHP的__toString()魔术方法:https://www.php.net/manual/en/language.oop5.magic.php#object.tostring

让我们为默认 User.php 模型做一个例子。

首先,为该模型创建一个 blade 文件,让我们将其创建为 /resources/views/model/user.blade.php 和一个虚拟组件;

<h1>{{ $user->name }}</h1>
<p>{{ $user->created_at->diffForHumans() }}</p>

现在为 User 型号设置此默认值 __toString()

将此添加到 app/Models/User.php

/**
 * @return string
 */
public function __toString(): string
{
    return view('model.user', ['user' => $this])->render();
}

现在您可以直接在 routes/web.php 中测试它;

Route::get('test', function () {
    echo \App\Models\User::first();
});

或尝试在任何视图中回应它;

{!! $user !!}

您不能使用 {{ $user }} 因为您需要 HTML 标签,所以您必须将其用作 {!! $user !!}