Skip to content
Choose a tag to compare


  • Added new unshift method in templates to support prepending content to sections (thanks @kozubsky)
  • Added support for PHP8 (thanks @roxblnfk)


  • Dropped explicit support for php 5. PHP 7/8 is allowed in composer, and only php 7.3-8.0 are tested in CI pipeline.

Internal Changes

  • Minor modifications to repo workflow for CI with GitHub Actions instead of Travis
  • Migrated docs from Jekyll to Hugo
Choose a tag to compare

EDIT (12/24/2020): This release has been abandoned. Some of this work will be merged into the v3 branch, but most of it has been scrapped. This tag will still be available, but a version 4 will not be based off of this alpha release.

v4 has been a complete rewrite in the plates system. It's fairly backwards compatible, but a lot of the internals have changed, and we still have a decent amount of features and work to do for v4.

Significant Changes

  • Templates are Immutable VO's
  • Rendering is handled via RenderTemplate interfaces
  • Extensions are first class citizens
  • The Engine is now a small wrapper for an IoC Container

New Features

  • RenderContext API for defining composable functions and more
  • Components
  • Powerful and customizable naming strategies for dynamic base paths
  • Multi folder fallbacks
  • Relative and Absolute Path templates
  • Better Error Handling
  • Default Layouts
  • Deep Sections #169
  • Template Composers
  • Static File Rendering
  • Image/Base64Encoding Rendering
  • And probably a few more ;p

Documentation is lacking for many of these features. Contributions are welcome! The best way to learn about the features it to look at the tests and examples.

Choose a tag to compare
  • Added the ability to append content to sections using the new push() function.
  • Added an end() function as an alias to stop().
Choose a tag to compare
  • Fixed an issue where template functions were not accessible from extensions.
  • Fixed an issued with the URI extension throwing errors when it shouldn't.
  • Added the ability to get all template data by calling $template->data().
  • Added the ability to render a template via the toString() magic method.
  • Added the ability to run the tests using composer test.
  • Improvements to error handling when rendering templates.
  • Various coding style, CI and documentation improvements.
Choose a tag to compare
  • Fix bug related to output buffering and exceptions (#78).
  • Improvements to escaping (#56).
  • Various CI and packaging improvements.
Choose a tag to compare
  • Added batch functionality to the escaping functions.
Choose a tag to compare
  • Added ability to define the default content of a section.
  • Various code improvements (cleanup DocBlocks, class simplification, add Composer keywords, etc).
Choose a tag to compare
  • Added all missing tests.
  • Improved custom function name validation.
  • Fixed bug with fallback folders, where the file extension wasn't being applied.
  • Improved error handling in Template class.
Choose a tag to compare
  • Updated extension interface to ensure that an instance of the Engine class be passed to the register() method.
  • Minor code cleanup.
Choose a tag to compare
  • Added ability to share data across templates.
  • Added ability to preassign data to specific templates.
  • Added ability to create one-off template functions, without using an extension.
  • Added new folder "fall backs", where missing folder templates will fall back to the default folder.
  • Added new render() method to Engine class, improving the use of the Engine as the primary API.
  • Templates variables are now accessed without the $this pseudo-variable.
  • Total overhaul to how extensions are registered. Replaced getFunctions() method with new register() method.
  • Section content is no longer assigned to template variables. Use the the section() function instead.
  • Renamed section end() function to stop(). This fits more appropriately with the start() function.
  • Renamed get() function to fetch().
  • Renamed pathExists() method in the Engine class to exists().
  • Renamed getTemplatePath() method in the Engine class to path().
  • Renamed makeTemplate() method in the Engine class to make().
  • Removed the ability to assign template data directly to the Template class. For example: $this->name = 'Jonathan'. This applies both within and outside of templates. Use the data() method instead.
  • Removed getEngine() method from the Template class. There's no reason to need this anymore.
  • Removed addFolders() method from the Engine() class.
  • Removed unloadExtension() and unloadExtensionFunction() methods from the Engine() class.