evanschleret/lara-mjml
Composer 安装命令:
composer require evanschleret/lara-mjml
包简介
Just a service provider for Spatie's MJML wrapper
关键字:
README 文档
README
LaraMJML
MJML rendering for Laravel Blade emails with a dedicated view engine, configurable MJML options, and predictable output for Mailables and Notifications.
Why LaraMJML
LaraMJML gives you a focused way to render MJML in Laravel without changing your email workflow:
- keeps Laravel Blade as the template layer
- compiles
.mjml.blade.phplayouts through an MJML view engine - supports MJML runtime options from Laravel config
- works with Mailables and Notifications
- keeps rendering behavior deterministic across environments
Requirements
- PHP
>=8.2 - Laravel
12.xor13.x - Node.js runtime with the
mjmlpackage installed
Installation
Install the package:
composer require evanschleret/lara-mjml
Install MJML in your Laravel app:
npm install mjml
Publish the package config (optional):
php artisan vendor:publish --provider="EvanSchleret\LaraMjml\Providers\LaraMjmlServiceProvider"
Quick start
Create an MJML layout:
<mjml> <mj-body> <mj-section> <mj-column> @yield('content') </mj-column> </mj-section> </mj-body> </mjml>
Save it as:
resources/views/layouts/base.mjml.blade.php
Create your email view with regular Blade inheritance:
@extends('layouts.base') @section('content') <mj-text>Hello {{ $userName }}</mj-text> @endsection
Save it as:
resources/views/emails/welcome.blade.php
Blade file rules
Use this hierarchy to avoid malformed MJML:
- the layout contains
<mjml>and<mj-body> - the layout filename includes
.mjml.blade.php - child views extend the MJML layout
- child views do not include
.mjmlin the filename
Correct:
resources/views/layouts/base.mjml.blade.php
resources/views/emails/welcome.blade.php
Incorrect:
resources/views/layouts/base.mjml.blade.php
resources/views/emails/welcome.mjml.blade.php
Use with Mailable
<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Mail\Mailables\Content; use Illuminate\Mail\Mailables\Envelope; use Illuminate\Queue\SerializesModels; class WelcomeMail extends Mailable { use Queueable; use SerializesModels; public function __construct( public string $userName, ) {} public function envelope(): Envelope { return new Envelope( subject: 'Welcome', ); } public function content(): Content { return new Content( view: 'emails.welcome', with: [ 'userName' => $this->userName, ], ); } }
Send it:
use App\Mail\WelcomeMail; use Illuminate\Support\Facades\Mail; Mail::to($user->email)->send(new WelcomeMail($user->name));
Use with Notification
<?php namespace App\Notifications; use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; class WelcomeNotification extends Notification { use Queueable; public function __construct( private readonly User $user, ) {} public function via(object $notifiable): array { return ['mail']; } public function toMail(object $notifiable): MailMessage { return (new MailMessage()) ->subject('Welcome') ->view('emails.welcome', [ 'userName' => $this->user->name, ]); } }
Dispatch it:
$user->notify(new WelcomeNotification($user));
Configuration
The config/laramjml.php file controls:
binary_path: path to the Node binary for MJML executionbeautify: format generated HTMLminify: minify generated HTMLkeep_comments: preserve MJML comments in outputoptions: extra options passed to MJML
Environment variables:
MJML_NODE_PATH=null LARA_MJML_BEAUTIFY=false LARA_MJML_MINIFY=true LARA_MJML_KEEP_COMMENTS=false
Troubleshooting
- Empty or broken HTML: ensure only the layout contains
<mjml>and<mj-body> - MJML binary error: install
mjmlin the project and verify Node.js is available - Malformed MJML exceptions: remove
.mjmlsuffix from child views and keep it only on the layout
Testing
Run tests:
composer test
Validate MJML templates
Validate all MJML Blade layouts:
php artisan laramjml:validate
Validate specific paths:
php artisan laramjml:validate --path=resources/views/emails php artisan laramjml:validate --path=resources/views/layouts/base.mjml.blade.php
Use a different validation level:
php artisan laramjml:validate --validation=soft
The command returns a non-zero exit code when at least one template fails validation, so it is ready for CI workflows.
Roadmap
- Add an optional Artisan install command (
laramjml:install) to publish config in one step - Add optional plain HTML fallback rendering when MJML conversion fails
- Add built-in MJML lint/validate command for CI workflows
- Add a stub generator for MJML layout + starter email view
- Add snapshot tests for common MJML output patterns
- Add first-party examples for dark mode email patterns
- Add docs for queue-first email pipelines with MJML pre-rendering
- Add benchmarking docs and performance tips for high-volume mailing
Other packages
If you want to explore more of my packages:
- evanschleret/formforge
- evanschleret/formformclient (FormForge Client)
- evanschleret/laravel-user-presence
- evanschleret/laravel-typebridge
Open source
- Contributing guide: CONTRIBUTING.md
- Security policy: SECURITY.md
- Code of conduct: CODE_OF_CONDUCT.md
- License: LICENSE
evanschleret/lara-mjml 适用场景与选型建议
evanschleret/lara-mjml 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 48.44k 次下载、GitHub Stars 达 20, 最近一次更新时间为 2024 年 07 月 23 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「EvanSchleret」 「lara-mjml」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 evanschleret/lara-mjml 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 evanschleret/lara-mjml 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 evanschleret/lara-mjml 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
统计信息
- 总下载量: 48.44k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 20
- 点击次数: 17
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2024-07-23
