leafo/lessphp
leafo/lessphp is a PHP compiler for the LESS CSS language. Compile .less files to CSS in your apps or build scripts, with support for variables, mixins, nesting, imports, and other core LESS features, plus caching and CLI usage.
Installation
composer require leafo/lessphp
Add to composer.json if not using autoloading:
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
Basic Compilation
use lessc;
$less = new lessc();
$css = $less->compile('body { color: #ff0000; }');
// Outputs: "body { color: rgb(255, 0, 0); }"
First Use Case: Compile a LESS File
$less = new lessc();
$css = $less->compileFile('path/to/styles.less');
file_put_contents('path/to/styles.css', $css);
Where to Look First
lessc.php source file for core functionality.Compile on Demand (Dynamic)
$less = new lessc();
$css = $less->compile($lessCode);
return response($css, 200)->header('Content-Type', 'text/css');
Compile and Cache (Static)
$cacheKey = 'styles_' . md5($lessCode);
if (cache()->has($cacheKey)) {
return cache()->get($cacheKey);
}
$less = new lessc();
$css = $less->compile($lessCode);
cache()->put($cacheKey, $css, now()->addHours(1));
return $css;
Integrate with Laravel Mix
// webpack.mix.js
mix.less('resources/less/app.less', 'public/css/app.css');
Use lessphp as a fallback or for server-side compilation.
Middleware for LESS Requests
// app/Http/Middleware/CompileLess.php
public function handle($request, Closure $next) {
if ($request->path() === 'compile-less') {
$less = new lessc();
$css = $less->compile($request->input('less'));
return response($css, 200)->header('Content-Type', 'text/css');
}
return $next($request);
}
Blade Directives
// Register in AppServiceProvider
Blade::directive('less', function ($expression) {
$less = new lessc();
return "<?php echo \$less->compile($expression); ?>";
});
Usage:
@less('$variable: #ff0000; body { color: $variable; }')
Laravel Views
// In a controller
$less = new lessc();
$css = $less->compile(view('less.styles')->render());
return response($css, 200)->header('Content-Type', 'text/css');
API Endpoint for Dynamic Theming
Route::post('/theme/compile', function (Request $request) {
$less = new lessc();
$css = $less->compile($request->input('less'));
return response($css, 200)->header('Content-Type', 'text/css');
});
Performance Overhead
less.js).now()->addDays(7) for cache TTL in production.File Paths and Permissions
lessc->compileFile() has correct paths and read/write permissions.public_path() helper:
$css = $less->compileFile(public_path('css/styles.less'));
Imports and Relative Paths
@import paths are relative to the compiled file. Use absolute paths or resolve them dynamically:
$less->setImportDir(public_path('css/imports'));
Memory Limits
memory_limit. Increase it temporarily:
ini_set('memory_limit', '512M');
Deprecated Features
Enable Debug Mode
$less = new lessc();
$less->setFormatter('compressed'); // or 'compressed', 'compact', 'expanded'
$less->setLogLevel(lessc::LOG_DEBUG);
Check for Errors
try {
$css = $less->compile($lessCode);
} catch (lesscException $e) {
Log::error('LESS Compilation Error: ' . $e->getMessage());
return response('Compilation failed.', 500);
}
Custom Functions Register custom LESS functions:
$less->registerFunction('myfunc', function($arg) {
return $arg * 2;
});
Environment-Specific Settings
if (app()->environment('production')) {
$less->setFormatter('compressed');
} else {
$less->setFormatter('expanded');
}
Pre/Post-Processing Hook into compilation with events (if supported) or wrap the compiler:
$less = new lessc();
$lessCode = preg_replace('/@import.*;/', '', $lessCode); // Remove imports
$css = $less->compile($lessCode);
Custom Output Filters Modify output after compilation:
$css = $less->compile($lessCode);
$css = str_replace('color: rgb(255, 0, 0);', 'color: #f00;', $css);
Extend with Traits Create a custom compiler class:
class CustomLessCompiler extends lessc {
public function compileWithCache($lessCode) {
// Custom caching logic
}
}
How can I help you explore Laravel packages today?