evanschleret/lara-mjml 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

evanschleret/lara-mjml

Composer 安装命令:

composer require evanschleret/lara-mjml

包简介

Just a service provider for Spatie's MJML wrapper

README 文档

README

LaraMJML banner

LaraMJML

MJML rendering for Laravel Blade emails with a dedicated view engine, configurable MJML options, and predictable output for Mailables and Notifications.

Packagist Version Packagist Downloads License Tests PHP >= 8.2 Laravel 12.x | 13.x

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.php layouts 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.x or 13.x
  • Node.js runtime with the mjml package 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 .mjml in 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 execution
  • beautify: format generated HTML
  • minify: minify generated HTML
  • keep_comments: preserve MJML comments in output
  • options: 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 mjml in the project and verify Node.js is available
  • Malformed MJML exceptions: remove .mjml suffix 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:

Open source

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 我们能提供哪些服务?
定制开发 / 二次开发

基于 evanschleret/lara-mjml 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

与 evanschleret/lara-mjml 相关的其它包

同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:

统计信息

  • 总下载量: 48.44k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 20
  • 点击次数: 17
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 20
  • Watchers: 2
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2024-07-23