overtrue/laravel-ueditor
Laravel integration for Baidu UEditor, giving your app a ready-made rich text editor with built-in upload handling, routes, controllers and publishable config. Drop it into any Laravel project to add UEditor's toolbar, image and file uploads without writing server-side glue yourself.
composer require overtrue/laravel-ueditor --ignore-platform-reqs, or better, fork it and bump the illuminate/* constraints. Confirm the resolved version in composer.lock before relying on it.php artisan vendor:publish --provider="Overtrue\LaravelUEditor\UEditorServiceProvider"
Check config/ueditor.php (upload disk, path, URL prefix, allow-lists, max sizes) and whatever public assets tag gets published. Because the repo is gone, run php artisan vendor:publish with no args and inspect the tags — do not assume names./ueditor/server) that UEditor calls with an action query param (config, uploadimage, uploadfile, uploadscrawl, listimage, catchimage, …).
php artisan route:list | grep -i ueditor
dist (or the package's published assets) to public/vendor/ueditor, set UEDITOR_HOME_URL, then instantiate:
var ue = UE.getEditor('content', {
serverUrl: '/ueditor/server',
initialFrameHeight: 400
});
<textarea name="content" id="content"> to the Blade view, point serverUrl at the package route, submit, and confirm the uploaded image lands on your configured disk and returns a usable URL.Because the repository is unknown/unavailable, treat the config keys and view helpers as discoverable: read vendor/overtrue/laravel-ueditor/config/ueditor.php and the controller first. That file is your source of truth for what actually works.
?action=.... Handle config separately from uploads; the config action returns a JSON blob (allow-lists, max sizes, image URLs) that the editor uses client-side. Keep server-side validation authoritative regardless of what config says.serverUrl. Use UE.getEditor(id, { toolbars: [...] }) with a trimmed toolbar per field (e.g., short summary vs. full article body).<textarea> is not always current. Call ue.sync() on form submit (or bind to the editor's contentchange and mirror it into the textarea) so Laravel receives the HTML.$name, $value, and optional toolbar config, and emits the textarea plus the editor bootstrap. This is more reliable than depending on a package directive whose API may have drifted.routes/web.php, oraction switch yourself (it is small: uploadimage, uploadfile, uploadscrawl, listimage, catchimage).
The response contract is strict — see Gotchas.public disk this is Storage::disk('public')->url($path). For S3, ensure url() is configured; UEditor will embed whatever string you return, so a signed/expiring URL will break once it expires.content as nullable|string and, if you want a hard guarantee, run it through HTMLPurifier before persistence. For "required" semantics, remember <p><br></p> is UEditor's empty state — normalise it.illuminate/support constraint failures. Fork-and-bump, or replace with a maintained editor (TinyMCE, Tiptap, or a maintained UEditor bridge). This is the single biggest risk for day-to-day use.VerifyCsrfToken::$except or the token isn't sent. Excluding the route is common but means the upload endpoint needs its own auth check.{"state":"SUCCESS","url":"...","title":"...","original":"...","size":123,"type":".png"} and failure {"state":"error message"}. Returning a Laravel JsonResponse from a validation failure with different keys silently shows "unknown error" in the UI.config.json and the server action=config response. Mismatched imageMaxSize / imageAllowFiles cause confusing client-side rejections or server-side rejections with no UI feedback. Keep them in sync or return the same config from the server action.listimage / listfile leak directory listings. These actions enumerate uploaded files. Disable them unless you actually use the "online images" tab; they can expose other users' uploads when a shared folder is used.catchimage is an SSRF vector. It fetches remote URLs server-side. Restrict schemes/hosts or disable it; a naive implementation will happily hit 169.254.169.254.url_prefix in config, the disk's url, and the physical public path must agree. The most common bug is "image uploads fine but shows a broken preview" — that's a URL-prefix or symlink (storage:link) problem, not an upload problem.config/ueditor.php, run php artisan config:clear. With config:cache active the changes silently don't apply, which looks like "the package ignores my config."UEDITOR_HOME_URL must end consistently (trailing slash matters). If the editor loads but the toolbar icons are broken, the base URL is wrong; if the editor doesn't load at all, it's a 404 on ueditor.all.min.js.{!! !!} only for sanitized content, and prefer a Purifier allow-list (no <script>, no on* attributes, restricted <a href> schemes).action switch — which, given the package's age, is often the cleanest long-term move.How can I help you explore Laravel packages today?