evolution-cms/evolution
Evolution CMS is an open-source PHP content management system focused on speed, security, and flexibility. Build and manage websites with a familiar manager interface, powerful templating, plugins, and extensions, with modern development tools and an active community.
Install via Composer:
composer create-project evolution-cms/evolution your-project-name
Follow the CLI prompts to configure the database and basic settings.
First Access:
/manager to log in (default credentials: admin/admin).php artisan evolution:migrate
First Use Case:
{{ resource.get('content') }}
php artisan evolution:deploy
/docs (local) or official docs.resources/views/.php artisan evolution:make:snippet to scaffold logic.Content-Driven Development:
[[*content]] placeholders in Chunks or Twig {{ resource.get('field') }}.resources/views/base.twig for site-wide layouts.getRelatedResources):
// app/Snippets/getRelatedResources.php
return Evolution\Resources::where('parent', $resource->id)->get();
Plugin-Based Extensibility:
OnPageNotFound):
// app/Plugins/Redirect404.php
public function onPageNotFound() {
return redirect('/custom-404');
}
config/evolution/plugins.php:
'plugins' => [
'Redirect404' => true,
],
Multilingual Content:
tv (Template Variables) for language-specific fields:
{{ resource.get('title', 'en') }} {# Fallback to default lang #}
resources/lang/{locale}/.API Integration:
// app/Http/Controllers/Api/ResourcesController.php
public function index() {
return Evolution\Resources::all();
}
evolution:api middleware for authentication.php artisan vendor:publish --tag=evolution-assets
Route::get() alongside Evolution’s [[*path]] routing.<link href="{{ asset('css/app.css') }}" rel="stylesheet">
evolution_resources table via migrations (e.g., custom_meta column).class CustomResource extends \Evolution\Resources {
protected $casts = ['custom_meta' => 'array'];
}
Caching Quirks:
php artisan evolution:clear-cache
[[++cache]] in Chunks to disable caching for dynamic content.Twig vs. Legacy Syntax:
[[*placeholders]] with Twig can cause conflicts.{% raw %}:
{% raw %}[[*content]]{% endraw %}
Plugin Loading Order:
config/evolution/plugins.php:
'plugins' => [
'PluginA' => ['priority' => 10],
'PluginB' => ['priority' => 20],
],
Database Migrations:
php artisan migrate directly may skip Evolution tables.php artisan evolution:migrate
Multilingual SEO:
[[+alias]] with language fallbacks:
<title>{{ resource.get('meta_title', resource.get('title')) }}</title>
Enable Debug Mode:
// config/evolution.php
'debug' => env('APP_DEBUG', true),
Log Events:
// In a Plugin/Snippet
\Evolution\Log::info('Custom event triggered', ['data' => $data]);
Check logs at /manager/system/logs/.
Common Errors:
[[*path]] is set in the Resource’s URL.storage/logs/laravel.log for PHP errors.storage/ and bootstrap/cache/ are writable.Custom Fields:
Evolution\Fields\FieldType to create reusable input types.ColorPicker field via a module.Event System:
OnResourceSave, OnWebPagePrerender, OnUserLogin.app/Events/EvolutionEventServiceProvider.php:
public function boot() {
Event::listen('OnResourceSave', function ($resource) {
// Custom logic
});
}
Theming:
vendor/evolution-cms/evolution/resources/views/ to resources/views/.{{ parent() }} in Twig to inherit parent template logic.CLI Commands:
evolution:make:snippet) by publishing and overriding:
php artisan vendor:publish --tag=evolution-commands
How can I help you explore Laravel packages today?