NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #1170 most downloaded on Packagist
The standalone version Blade Template Engine from Laravel in a single php file
Last release 4 days ago
03 Oct 2026
Release timing varies
gaps range from 3 weeks to 13 months
Some releases are documented
notes for 19 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
10 years old
116 releases · first in 2016
Nothing published for this version
Nothing published for this version
Fixed a bug added with the changes in the comment function
Fixed a bug added with the changes in the comment function
Fixed a last-second bug with comments.
One column per quarter.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
-
Fixed a bug in @foreach and $loop->last. Now it returns the correct value.
Fixed a bug in @foreach and $loop->last. Now it returns the correct value.
if the view file is not found then it shows the full path.
if the view file is not found then it shows the full path.
- updated BladeOneCache.php -
updated BladeOneCache.php
fix in method parseArgs() when it returns a single array
fix in method parseArgs() when it returns a single array
@splitforeach fixed. Now, it works as base zero.
@splitforeach fixed. Now, it works as base zero.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
- 2018-06-11 2.3.2 Fixed bladeonehtml to allows readonly value.
2018-06-11 2.3.2 Fixed bladeonehtml to allows readonly value.
2018-05-06 2.3.1 Fixed a problem with @verbatim. Add the method runString for evaluating a function
2018-04-13 2.3 The end result clean spaces. PHPDoc cleaned (checked with PHPStorm 2018.1). Fixed some typos (sorry about that).
Full list of changes applied to this working copy (baseline: upstream 4.19.1). All bug fixes were experimentally verified before and after the change,
Full list of changes applied to this working copy (baseline: upstream 4.19.1).
All bug fixes were experimentally verified before and after the change, and the full test suite
(84 tests / 189 assertions) passes on every step.
composer.json.ext-json from composer.json requirements (JSON is a core extension since PHP 8.0).4.19.1 → 5.0.0 (class VERSION + docblock @version).TypeError instead of being silently coerced/misbehaving.getInstance() no longer fatals on first call — $instance was a non-nullable typed staticself::$instance === null threwpublic static ?BladeOne $instance = null;.@prepend directive fixed (was doubly broken):
startPrepend() used array_unshift($this->pushStack[], $section) (passing a non-variable →TypeError: Argument #1 must be of type array, null given). Nowarray_unshift($this->pushStack, $section) — correct LIFO pairing with stopPrepend()'sarray_shift (nested @prepend now works).compilePrepend() generated $this->startPush(...) (copy-paste bug). Now generates$this->startPrepend(...).ipClient() regex fixed — pattern was /^(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})$/ (literal d,HTTP_X_FORWARDED_FOR was never validated/returned. Now/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.extract() collisions fixed — evaluateText() and evaluatePath() calledextract($variables) without EXTR_SKIP; a view variable named content silently replaced thecompiledFile broke the include. Both now use extract($variables, EXTR_SKIP)runString() already did).compileForeach() validates its expression — a malformed @foreach($x) (no as) emittedUndefined array key) and silently generated broken code$__currentLoopData = ;). Now it throws a clear RuntimeException via showError().static::last($this->componentStack); call in endSlot().= null defaults — $currentUser, $currentRole,$baseDomain, $canonicalUrl, $currentUrl (prevents "uninitialized typed property" errorsgetCurrentUser() without setAuth()).isAbsolutePath() — added length guard for one-character paths on Windows (avoidsUndefined offset warning reading $path[1]).php -n, min of 5 runs)getTemplateFile()/getCompiledFile() are called several times per rendercompile, isExpired, evaluatePath), each doing an is_file() loop + hash. Results are now$templateFileCache/$compiledFileCache:
setPath() and setFileExtension() clear both caches via clearPathCaches();setCompiledExtension() and setCompileTypeFileName() clear the compiled cache.run() with cached compiles ≈ 8-9 % faster (300 renders: ~24.5 ms vs ~26.8 ms).getEchoMethods() cached — was rebuilt + uksorted with a closure per HTML token; now$echoMethodsCache and invalidated in setContentTags() (rawTags have no setter).mb_strpos shims and function_exists('mb_strpos') checks removedstartsWith()/contains() in favor of native str_starts_with()/str_contains().compileString ×30: ~16.4 ms vs ~21.5 ms).class_uses($this) instead of scanning every trait in the processget_declared_traits()), same trait-"constructor" convention.$optimize whitespace stripping — two preg_replace() passes merged into one:/^(?: {2,}|\t{2,})/m.missingTranslation() — filesize+fopen+fwrite+fclose replaced by a singlefile_put_contents(..., FILE_APPEND) (with the 100 KB rewrite rule preserved).method_exists() with aget_class_methods()-based per-class cache made compilation ~5 % slower (nativemethod_exists() is already an O(1) C-level lookup; the strtolower normalization needed to keep@endpushonce → compileEndpushOnce — costs more than itAI_GUIDE.md §9.str_contains() / str_starts_with() / str_ends_with() replaced boolean strpos()wrapPHP, compileString, postRun, getTemplateFile,yieldPushContent, wildCardComparison, compileStatements, fixNamespaceClass, renderEach,setBaseUrl, getCurrentUrl(Calculated), parseArgs, …wildCardComparison also uses str_ends_with() and negative string offsets).match expressions: colorLog(), compileComments(), compileViewName().self::convertArgCallBack(...) in convertArg().compileRawEchos, compileRegularEchos,compileEscapedEchos) and restoreVerbatimBlocks() callbacks.$text[-1] in isQuoted(), $textWithWildcard[-1].@ suppressions: @explode('?', $link)[0] → plain explode()[0] (always@parse_url($this->baseUrl)['host'] → safe (\parse_url(...) ?: [])['host'] ?? null.array_key_last() polyfill at the bottom of BladeOne.php (native since 7.3).suggest for consumers).__construct(), getInstance(): string|array|null $templatePath, ?string $compiledPath, int $mode, int $commentMode.run(?string $view, array $variables), runString(string $string, array $data),compileString(string $value), compile(?string $templateName, bool $forced).getTemplateFile(?string), getCompiledFile(?string), getFile(string), isExpired(?string),evaluatePath(string, array), evaluateText(string, array),runInternal(string, array, bool, bool), evalComposer(string).setPath(), setMode(int), setIsCompiled(bool), setOptimize(bool),setFileExtension(string), setCompiledExtension(string), setPhpTag(string).directive(string, callable), directiveRT(string, callable),registerIfStatement(string, callable), check(string, ...).showError(string, string, bool, bool), setAuth(?string, ?string, ?array) (nullable: testsnull for "no user"), share()/with(string|array, mixed),composer(string|array|null, callable|string|object|null).getCsrfToken(bool, string), csrfIsValid(bool, string), regenerateToken(string).addInclude(string, ?string), addAssetDict()/addAssetDictCDN(string|array, string),relative(string), dump(mixed, bool), convertArg(array|string).wrapPHP(?string, string, bool), stripParentheses(?string), isQuoted(?string),isVariablePHP(?string), addInsideQuote(string, string),parseArgs(?string, string, string, bool).e(mixed), enq(mixed); getCurrentUser()/getCurrentRole(): ?string + nullable setters;setCurrentPermission(?array); setAliasClasses(array), addAliasClasses(string, string).wildCardComparison(string, ?string), injectClass(string, ?string), getArgs(?string).runChild, addLoop, startSection, startPush, _e, _ef, _n, format,includeWhen, includeFirst, renderEach, splitForeach, …) so bad template input keepsTypeErrors@foreach($undefinedVar as $x)).^8.5 → ^10.5 (installed 10.5.65) viacomposer update phpunit/phpunit --with-all-dependencies.phpunit.xml migrated to the PHPUnit 10 schema (--migrate-configuration):<filter><whitelist> → <source><include>, cacheDirectory=".phpunit.cache", removedverbose, convert*ToExceptions, …)..gitignore: added .phpunit.cache/.phpunit.xml.bak, .phpunit.result.cache.README.md: PHP badges updated to php->=8.1 and php-8.x.AI_GUIDE.md (new) — AI-oriented engineering guide: repository map, the two-phaseAI_GUIDE.md updated for 5.0.0: PHP >= 8.1 requirements, PHPUnit 10.5, and aCHANGELOG.md).php -l clean on lib/BladeOne.php.getInstance() first call, nested @prepend, ipClient() valid/invalid,startsWith/contains/wildCardComparison, friendly run() error, nullable defaults,setAuth(null), VERSION, commentMode behavior — all OK.php -n, min of 5): compileString ×30 ≈ 16.4 ms (was ~21.5 ms),run() ×300 ≈ 24-27 ms (was ~26.8 ms).Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Pull #203
Pull #203
Added @assetCdn () that works like @asset ()
Compatibility with PHP 8.4 (without warning)
Fixed a bug when the stack is called before it is used.
Addressing the next problems #193 #194
See https://github.com/EFTEC/BladeOne/wiki/Changelog
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
- 2018-09-01 3.8 Sorry Blade class,but you must go. \eftec\bladeone\BladeOneBlade.php is no-more so the static call and the instance. (#47)[https://gi
2018-09-01 3.8 Sorry Blade class,but you must go. \eftec\bladeone\BladeOneBlade.php is no-more so the static call and the instance. (#47)[https://github.com/EFTEC/BladeOne/issues/47] it was the last straw.
2018-08-29 3.7 phpdoc block reduced. "To do" comments deleted. Fixed issue (#44)[https://github.com/EFTEC/BladeOne/issues/44]
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
- 2018-08-16 3.4 Custom if,@php tag and some fixes with @switch
2018-08-16 3.4 Custom if,@php tag and some fixes with @switch
Your coding agent can read these notes before it upgrades. Set up the MCP server →