dflydev/embedded-composer-bundle
Bundle Registration:
Add to AppKernel.php:
new Dflydev\EmbeddedComposerBundle\DflydevEmbeddedComposerBundle(),
AppKernel, not Kernel.php.Configuration:
Override Composer settings via config.yml:
dflydev_embedded_composer:
config:
repositories:
- type: vcs
url: 'git@github.com:vendor/package.git'
extra:
installer-paths: { 'src/': ['type:library'] }
Service Injection: Access Composer via Symfony’s container:
$composer = $this->get('dflydev_embedded_composer.composer');
$composer->runCommand('require', ['monolog/monolog']);
Command Extensions: Create a custom Symfony command to wrap Composer actions:
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class CustomComposerCommand extends Command
{
protected function execute(InputInterface $input, OutputInterface $output)
{
$composer = $this->getContainer()->get('dflydev_embedded_composer.composer');
$composer->runCommand('update', ['--no-dev' => true]);
$output->writeln('Dependencies updated!');
}
}
Event Listeners:
Hook into Composer events (e.g., post-install-cmd) to extend behavior:
$dispatcher->addListener(
'dflydev_embedded_composer.command.post-install-cmd',
function () {
// Post-install logic (e.g., cache warming, notifications)
}
);
Dependency Resolution: Use Composer’s API to inspect or modify dependencies:
$composer = $this->get('dflydev_embedded_composer.composer');
$lock = $composer->getLock();
$packages = $lock->getPackages();
CI/CD Pipelines: Embed Composer in a Symfony-based CI tool to manage dependencies without requiring Composer globally:
# .github/workflows/ci.yml
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: php bin/console embedded-composer:install
Legacy Migration: Gradually migrate Symfony 2.x apps by embedding Composer for dynamic updates:
// In a migration script
$composer = $this->get('dflydev_embedded_composer.composer');
$composer->runCommand('require', ['doctrine/orm:^2.0']);
Self-Service Portals: Expose Composer functionality to end-users via a Symfony frontend:
// Controller action
public function installDependencies()
{
$composer = $this->get('dflydev_embedded_composer.composer');
$composer->runCommand('require', [$this->request->get('package')]);
return new Response('Installed!');
}
Parameter Binding: Use Symfony’s parameter bag to configure Composer dynamically:
# config.yml
parameters:
embedded_composer_repo: 'https://custom-repo.example.com'
dflydev_embedded_composer:
config:
repositories:
- { type: composer, url: '%embedded_composer_repo%' }
Twig Integration: Expose Composer status to templates:
{# templates/base.html.twig #}
{% if app.container.get('dflydev_embedded_composer.composer').isInstalled() %}
<p>Dependencies are up-to-date.</p>
{% else %}
<p>Run `php bin/console embedded-composer:install` to update.</p>
{% endif %}
Security Context: Restrict Composer access to trusted roles:
# security.yml
access_control:
- { path: ^/admin/composer, roles: ROLE_ADMIN }
Enable Debug Mode:
php bin/console debug:config dflydev_embedded_composer
Log Composer Output: Redirect Composer logs to Symfony’s logger:
$composer = $this->get('dflydev_embedded_composer.composer');
$composer->setLogger($this->get('logger'));
$composer->runCommand('install');
Dry Runs: Test Composer commands without side effects:
php bin/console embedded-composer:install --dry-run
Custom Composer Classes: Override Composer’s core classes via Symfony’s compiler passes:
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class CustomComposerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$definition = $container->findDefinition('dflydev_embedded_composer.composer');
$definition->setClass('App\Custom\ComposerWrapper');
}
}
New Console Commands: Extend the bundle’s command namespace:
namespace App\Command;
use Dflydev\EmbeddedComposerBundle\Command\AbstractComposerCommand;
class CustomComposerCommand extends AbstractComposerCommand
{
protected function configure()
{
$this->setName('app:composer:custom');
}
}
Event Subscribers: Listen to Composer events globally:
use Dflydev\EmbeddedComposer\Event\ComposerEvent;
class ComposerSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
'dflydev_embedded_composer.command.pre-install-cmd' => 'onPreInstall',
];
}
public function onPreInstall(ComposerEvent $event)
{
// Pre-install logic
}
}
Symfony 2.x Only:
Class 'Symfony\Component\DependencyInjection\Loader\YamlFileLoader' not found if using Symfony 3+.2.1–2.3 in composer.json:
"symfony/symfony": "2.8.*"
Composer 1.x Quirks:
composer.json schema validation).composer.json before passing it to the bundle.PHP 5.3.2 Limitations:
composer/composer:1.10 for compatibility.Service Container Conflicts:
Service "dflydev_embedded_composer.composer" not found.Lock File Handling:
composer.lock by default.dflydev_embedded_composer:
config:
files:
- composer.json
- composer.lock
Plugin Incompatibility:
composer/installers) may not work.--no-plugins flag or manually install plugins.Memory Limits:
php.iniHow can I help you explore Laravel packages today?