Day 32 | 常见 Livewire 问题:与 Controller 兼容的几种方式

使用 Livewire 之後,在 Layout 上会改用 component 的 $slot 方式来绑定 Livewire 渲染的画面。这项改动会导致原本 Controller Blade 在 @extends('layouts.app') 时会报错 ErrorException Undefined variable: slot

为了不用把一样的 Layout 拆成两个各自维护,以下整理了几个不同的方法与思考方向。


方法一、Livewire 使用传统方式渲染

这个方法是把 Livewire 改成透过 extends 去产生画面,因此如果是原有专案则可以不用改变 Layout 的设置,新的专案的话则必须把 {{ $slot }}替换成 @yield()。之後在每个 Livewire 在 render() 额外加一行 ->extends() 去指定要使用哪个 Layout,这样就完成了。

而在 Controller Blade 方面,则可以不用做任何改动就可以完成兼容。

# Layout
<head>
    @livewireStyles
</head>
<body>
    @yield('content')
 
    @livewireScripts
</body>
# Livewire
public function render()
{
    return view('livewire.show-posts')
        ->extends('layouts.app');
}

如果有多个 @yield 可以透过 ->section() 来指定是哪一个:

public function render()
{
    return view('livewire.show-posts')
        ->extends('layouts.app')
        ->section('main');
}

*心得

这个方法比较适合用在旧的专案上,只是在大量使用 Livewire 的时候会觉得很烦要一直加用 extends。其余部分是都还 ok,也不会影响到原本的专案。

优点:

  • 一般的 Blade 可以完全不做更动就使用
  • 容易部署、理解
  • 在既有专案上加入 Livewire 也不会影响专案

缺点:

  • 每个 Livewire 都要加上 ->extends()

方法二、把 Layout 包成 Component

*原理

由於 $slotLaravel Component 中的使用方法,当元件中没有被指定的内容都会被丢到 $slot 中,像是:

# component - 'demo'
<div>
	<p>Show Slot:</p>
	{{ $slot }}
</div>
# blade
<x-demo>
	<p>CLICK the button NOW !</p>
	<button>Click Me</button>
</x-demo>
# 实际渲染
<div>
	<p>Show Slot:</p>
	<p>CLICK the button NOW !</p>
	<button>Click Me</button>
</div>

因此可以透过这个方式把原本的 Layout 给它弄成 Component 的方式,就可以同时兼容 Livewire 与原本的 blade。

*建立 Layout Component

php artisan make:component Layout

*修改 app/Views/Components/Layout.php

由於 Livewire 默认是使用 layouts.app,因此只要替换在 Component 中的 render() 原本所指定的 view 就好。

public function render()
{
    return view('components.layout');
}

替换成在 views/layouts 下的档案

public function render()
{
    return view('layouts.app');
}

*原本 Blade 改使用 <x-layout>

之後在原本的 Blade 页面所使用的 @extends('layouts.app') 就可以不用加了,之後都改用 <x-layout> 就可以将该页面的东西放入 Layout 中啦!

<x-layout>
 	...
</x-layout>

*心得

比较适合新建的全 Livewire 专案,哪天突然有需要用到从 Controller 直接产生画面的需求,就可以在不影响 Livewire 运行的情况下完美兼容。

优点:

  • Livewire 可以不做更动

缺点:

  • 以前的 blade 都要重新修改成新的格式
  • 对既有的专案比较不友善

总结

主要也是要看专案哪方面用比较多来选择兼容的方法,如果是原本的专案要追加 Livewire 的话,用第一种方法就能在不修改其他部分就能够兼容,还可以不用重构。

而新的专案如果是使用 Livewire 的话基本上是不会使用到 Controller 啦。但是万一有遇到要使用的场景再补上方法二的方式就可以了,不过用过了 Livewire 谁还回得去呢 XDD!


<<:  Day20 Anonymous page 与 RMAP

>>:  EP23 - 持续部署使用 Octopus Deploy 三部曲,新增 Octopus 专案及调整 Jenkins 环境

[Day 26] Final Project (2/5) — 准备开始

接下来几天的文章会像料理节目一样,用我事先准备好的材料 (模型、App...) 来进行说明,底下就来...

Day14-"字串"

在C语言里,字串就是字元的一维阵列,且这个字元阵列有一结尾符号「\0」我们称之为空字元,则这个字串称...

[第二十四只羊] 迷雾森林舞会XVIII 游戏角色设定again_final_final

天亮了 昨晚2号玩家死亡 关於迷雾森林故事 颤栗消逝 洛神:昨晚2号玩家被杀死了,邪恶阵营获胜,可以...

[Python 爬虫这样学,一定是大拇指拉!] DAY21 - 实战演练:JSON Response - 抓取个股日成交资讯

好的,讲解完 Requests 套件的基本介绍後,终於要进入真实情况的爬虫应用拉! 但我们一步一步来...

【Day11】忙得团团转的回圈

回圈指的是「重复做某件事,次数随着数值『递增」或『递减』,当数值满足所设的条件,则退出回圈」。 所...