jonassiewertsen/statamic-livewire
最新稳定版本:v3.8.1
Composer 安装命令:
composer require jonassiewertsen/statamic-livewire
包简介
A Laravel Livewire integration for Statamics Antlers engine.
README 文档
README
New Maintainer
Please switch to https://github.com/marcorieser/statamic-livewire instead. Switching is easy and there is no breaking change. Please check the Guide in the new repo.
Thanks for your support ❤️
Description
A third-party Laravel Livewire integration for Statamic.
It's as easy as it gets to get started with Livewire if using Statamic.
Installation
Pull in the Livewire package with composer
composer require jonassiewertsen/statamic-livewire
Manually including Livewire's frontend assets
By default, Livewire injects the JavaScript and CSS assets it needs into each page that includes a Livewire component. If you want more control over this behavior, you can manually include the assets on a page using the following Antlers tags or Blade directives:
<html> <head> <!-- If using Antlers --> {{ livewire:styles }} <!-- If using Blade --> @livewireStyles </head> <body> ... <!-- If using Antlers --> {{ livewire:scripts }} <!-- Blade --> @livewireScripts </body> </html>
Manually bundling Livewire and Alpine
If you need to include some custom Alpine plugins, you need to manually bundle the Livewire and Alpine assets and disable the automatic injection by using the following Antlers tag or Blade directive. Do not forget to include the Livewire styles as well.
<html> <head> <!-- If using Antlers --> {{ livewire:styles }} <!-- If using Blade --> @livewireStyles </head> <body> ... <!-- If using Antlers --> {{ livewire:scriptConfig }} <!-- Blade --> @livewireScriptConfig </body> </html>
Static caching
This addon adds an AssetsReplacer class to make Livewire compatible with half and full static caching. You may customize the replacers in the config of this addon:
'replacers' => [ \Jonassiewertsen\Livewire\Replacers\AssetsReplacer::class, ],
If you are using full measure static caching and you're manually bundling Livewire and Alpine as per the instructions above, you need to make sure to only start Livewire once the CSRF token has been replaced.
if (window.livewireScriptConfig?.csrf === 'STATAMIC_CSRF_TOKEN') { document.addEventListener('statamic:nocache.replaced', () => Livewire.start()); } else { Livewire.start(); }
Upgrade
Make sure to read the Livewire upgrade guide, in case you're updating to Statamic Livewire 3, as there are breaking changes:
https://livewire.laravel.com/docs/upgrading
General documentation
Include components
You can create Livewire components as described in the general documentation. To include your Livewire component:
<body> <!-- If using Antlers --> {{ livewire:your-component-name }} <!-- If using Blade --> <livewire:your-component-name /> </body>
if you want to include a component from a dynamic variable you can use the livewire:component tag:
<body> <!-- If using Antlers --> {{ livewire:component :name="variable" }} <!-- If using Blade --> <livewire:component name="$variable" /> </body>
@script and @assets
Antlers versions of @script and @assets are provided:
<body> {{ livewire:script }} <script>console.log('hello')</script> {{ /livewire:script }} </body>
<body> {{ livewire:assets }} <script src="some-javascript-library.js"></script> {{ /livewire:assets }} </body>
Blade or Antlers? Both!
If creating a Livewire component, you need to render a template file
namespace App\Http\Livewire; use Livewire\Component; class Counter extends Component { public function render() { return view('livewire.counter'); } }
More Information: (https://livewire.laravel.com/docs/components)
Normally your template file would be a blade file, named counter.blade.php. Great, but what about Antlers?
Rename your template to counter.antlers.html, use Antlers syntax and do whatever you like. No need to change anything inside your component Controller. How cool is that?
Passing Initial Parameters
You can pass data into a component by passing additional parameters
<!-- If using Antlers --> {{ livewire:your-component-name :contact="contact" }} <!-- If using Blade --> <livewire:your-component-name :contact="$contact">
To intercept with those parameters, mount them and store the data as public properties.
use Livewire\Component; class ShowContact extends Component { public $name; public $email; public function mount($contact) { $this->name = $contact->name; $this->email = $contact->email; } ... }
The Official Livewire documentation provides more information.
Keying Components
Livewire components are automatically keyed by default. If you want to manually key a component, you can use the key attribute.
<!-- If using Antlers --> {{ contacts }} {{ livewire:your-component-name :key="id" }} {{ /contacts }} <!-- If using Blade --> @foreach ($contacts as $contact) <livewire:your-component-name :key="$contact->id" /> @endforeach
The Official Livewire documentation provides more information.
Multi-Site
When using Livewire in a Multi-Site context, the current site gets lost between requests. There is a trait (\Jonassiewertsen\Livewire\RestoreCurrentSite) to solve that. Just include it in your component and use Site::current() as you normally do.
class ShowArticles extends Component { use \Jonassiewertsen\Livewire\RestoreCurrentSite; protected function entries() { return Entry::query() ->where('collection', 'articles') ->where('site', Site::current()) ->get(); } public function render() { return view('livewire.blog-entries', $this->entries()); } }
Paginating Data
You can paginate results by using the WithPagination trait.
Blade
To use pagination with Blade, please use the Livewire\WithPagination namespace for your trait as described in the Livewire docs.
Antlers
Pagination with Antlers does work similar. Make sure to use the Jonassiewertsen\Livewire\WithPagination namespace for your trait if working with Antlers.
In your Livewire component view:
{{ entries }}
...
{{ /entries }}
{{ links }}
use Jonassiewertsen\Livewire\WithPagination; class ShowArticles extends Component { use WithPagination; protected function entries() { $entries = Entry::query() ->where('collection', 'articles') ->paginate(3); return $this->withPagination('entries', $entries); } public function render() { return view('livewire.blog-entries', $this->entries()); } }
EXPERIMENTAL: Statamic Support
As a little experiment, support for an Entry or EntryCollection has been added, so you can make an entry or a entry collection simply a public property and it just works.
Supported types:
- Statamic\Entries\EntryCollection;
- Statamic\Entries\Entry;
namespace App\Livewire; use Livewire\Component; use Statamic\Entries\EntryCollection; use Statamic\Entries\Entry; class Foo extends Component { public EntryCollection $entries; public Entry $entry; // normal livewire stuff }
To make it work, you need to enable that feature first.
- php artisan vendor:publish
- Select statamic-livewire in the list
- Enable synthesizers
Entangle: Sharing State Between Livewire And Alpine
In case you want to share state between Livewire and Alpine, there is a Blade directive called @entangle. To be usable with Antlers, we do provide a dedicated tag:
<!-- With Antlers --> <div x-data="{ open: {{ livewire:entangle property='showDropdown' modifier='live' }} }"> <!-- With Blade --> <div x-data="{ open: @entangle('showDropdown').live }">
It's worth mentioning that, since Livewire v3 now builds on top of Alpine, the @entangle directive is not documented anymore. Instead, it's possible to entangle the data via the $wire object.
<div x-data="{ open: $wire.entangle('showDropdown', true) }">
This: Accessing the Livewire component
You can access and perform actions on the Livewire component like this:
<script> document.addEventListener('livewire:initialized', function () { // With Antlers {{ livewire:this set="('name', 'Jack')" }} // With Blade @this.set('name', 'Jack') }) </script>
It's worth mentioning that, since Livewire v3 now builds on top of Alpine, the @this directive is not used widely anymore. Instead, it's possible to access and manipulate the state directly via JavaScript / the $wire object.
<script> document.addEventListener('livewire:initialized', function () { // `{{ livewire:this }}` returns the instance of the current component {{ livewire:this }}.set('name', 'Jack') }) </script>
Lazy Components
Livewire allows you to lazy load components that would otherwise slow down the initial page load. For this you can simply pass lazy="true" as argument to your component tag.
<!-- With Antlers -->
{{ livewire:your-component-name :contact="contact" lazy="true" }}
Other Statamic Livewire Packages
If using Livewire, those packages might be interesting for you as well:
Did I miss a link? Let me know!
Credits
Thanks to:
- Marco Rieser to help maintaining this package
- Caleb and the community for building Livewire
- Austenc for the Statamic marketplace preview image
Requirements
- PHP 8.1
- Laravel 10 or 11
- Statamic 4 or 5
Support
I love to share with the community. Nevertheless, it does take a lot of work, time and effort.
Sponsor me on GitHub to support my work and the support for this addon.
License
This plugin is published under the MIT license. Feel free to use it and remember to spread love.
jonassiewertsen/statamic-livewire 适用场景与选型建议
jonassiewertsen/statamic-livewire 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 170.86k 次下载、GitHub Stars 达 92, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「addon」 「laravel」 「statamic」 「livewire」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 jonassiewertsen/statamic-livewire 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 jonassiewertsen/statamic-livewire 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 jonassiewertsen/statamic-livewire 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Statamic Fine Seo addon
This composer plugin enables installation of GravityForms WordPress plugin and its addons.
A lightweight floating toolbar for Statamic that gives logged-in users quick access to the CP and entry editor
Dropzone field for Laravel Backpack
This ConcreteCMS/concrete5 addon installs a block type that when added to a page allows you to redirect visitors to this page to another page that you specify or an external URL.
统计信息
- 总下载量: 170.86k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 92
- 点击次数: 19
- 依赖项目数: 2
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 未知