beatgeb/terrific-composer-bundle
Prerequisite: Install TerrificCoreBundle first—this bundle depends on it.
composer require brunschgi/terrific-core-bundle
Follow its installation instructions.
Add the Bundle:
composer require brunschgi/terrific-composer-bundle:1.0.*
Register it in AppKernel.php:
new Terrific\ComposerBundle\TerrificComposerBundle(),
First Use Case:
terrific_composer Twig extension to render frontend assets (JS/CSS) with versioning and fingerprinting.
{{ terrific_composer('assets/app.js') }}
ComposerLoader to resolve frontend dependencies (e.g., npm packages) in Laravel’s asset pipeline.Workflow:
app.js, styles.css) in web/assets/ (or configure a custom path in config/terrific_composer.yml).<script src="{{ terrific_composer('assets/app.js', { version: true }) }}"></script>
app.js?v=abc123) to bust caches. Configure in config/terrific_composer.yml:
terrific_composer:
versioning: true
fingerprint: true
Integration with Laravel Mix:
ComposerLoader is called after Mix processes assets. Override the TerrificComposerBundle’s build event in EventServiceProvider:
protected $listen = [
'terrific.composer.build' => [
\Terrific\ComposerBundle\EventListener\BuildAssetsListener::class,
],
];
npm/Bower Integration:
node_modules/) are managed externally. Use it to map these dependencies to Laravel’s public path:
# config/terrific_composer.yml
terrific_composer:
dependencies:
jquery: node_modules/jquery/dist/jquery.min.js
{{ terrific_composer('jquery') }}
Custom Loaders:
ComposerLoader to support custom asset sources (e.g., S3, CDNs). Override the load() method in a service:
use Terrific\ComposerBundle\Loader\ComposerLoaderInterface;
class CustomComposerLoader implements ComposerLoaderInterface {
public function load($asset) {
// Custom logic (e.g., fetch from S3)
return asset("https://cdn.example.com/{$asset}");
}
}
services.yml:
services:
terrific_composer.loader:
class: AppBundle\Service\CustomComposerLoader
terrific_composer Twig function to render assets conditionally:
{% if is_dev %}
{{ terrific_composer('assets/app.js', { debug: true }) }}
{% else %}
{{ terrific_composer('assets/app.min.js') }}
{% endif %}
minify) to assets:
{{ terrific_composer('assets/app.js')|minify }}
Outdated Dependencies:
TerrificCoreBundle. Test thoroughly for compatibility with modern Laravel (8+/9+) and Symfony components.symfony/twig-bridge, symfony/asset).Asset Path Conflicts:
terrific_composer.yml do not overlap with Laravel’s public/ directory. Use absolute paths:
terrific_composer:
base_path: '%kernel.project_dir%/web/assets'
Caching Issues:
php artisan cache:clear
php artisan config:clear
Enable Debug Mode:
debug: true in terrific_composer.yml to log asset resolution:
terrific_composer:
debug: true
storage/logs/laravel.log) for TerrificComposerBundle entries.Asset Not Found:
base_path. Use the terrific_composer:debug command (if available) or dump the loader:
$loader = $this->get('terrific_composer.loader');
dump($loader->load('assets/app.js'));
Custom Asset Processors:
AssetProcessor interface to add pre/post-processing (e.g., UglifyJS, PostCSS):
use Terrific\ComposerBundle\Processor\AssetProcessorInterface;
class CustomAssetProcessor implements AssetProcessorInterface {
public function process($asset) {
// Custom logic (e.g., minify)
return str_replace(' ', '', $asset);
}
}
services.yml:
services:
terrific_composer.processor:
class: AppBundle\Processor\CustomAssetProcessor
tags: ['terrific_composer.processor']
Event Listeners:
terrific.composer.build) to modify asset behavior:
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CustomSubscriber implements EventSubscriberInterface {
public static function getSubscribedEvents() {
return [
'terrific.composer.build' => 'onBuild',
];
}
public function onBuild(BuildEvent $event) {
$event->setAsset($event->getAsset() . '?custom=param');
}
}
Configuration Overrides:
config/packages/terrific_composer.yml:
terrific_composer:
versioning: false
fingerprint_algorithm: 'md5' # Default is 'crc32'
How can I help you explore Laravel packages today?