Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Embedded Composer Bundle Laravel Package

dflydev/embedded-composer-bundle

View on GitHub
Deep Wiki
Context7

Implementation Patterns

Symfony 2.x Integration

  1. Bundle Registration: Add to AppKernel.php:

    new Dflydev\EmbeddedComposerBundle\DflydevEmbeddedComposerBundle(),
    
    • Note: Symfony 2.x uses AppKernel, not Kernel.php.
  2. 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'] }
    
    • Use Case: Dynamically configure Composer repositories or installer paths.
  3. Service Injection: Access Composer via Symfony’s container:

    $composer = $this->get('dflydev_embedded_composer.composer');
    $composer->runCommand('require', ['monolog/monolog']);
    
    • Use Case: Programmatically trigger Composer commands (e.g., in a controller or command).

Custom Composer Logic

  1. 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!');
        }
    }
    
    • Use Case: Build domain-specific Composer workflows (e.g., "update production dependencies").
  2. 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)
        }
    );
    
    • Use Case: Automate post-install tasks (e.g., optimize autoloader, run migrations).
  3. Dependency Resolution: Use Composer’s API to inspect or modify dependencies:

    $composer = $this->get('dflydev_embedded_composer.composer');
    $lock = $composer->getLock();
    $packages = $lock->getPackages();
    
    • Use Case: Dynamic dependency analysis (e.g., feature flags, security audits).

Workflow Integration

  1. 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
    
    • Use Case: Self-contained dependency management in isolated environments.
  2. 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']);
    
    • Use Case: Incrementally upgrade dependencies before full framework migration.
  3. 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!');
    }
    
    • Use Case: Internal dev portals or SaaS platforms with custom dependency management.

Symfony-Specific Tips

  1. 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%' }
    
  2. 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 %}
    
  3. Security Context: Restrict Composer access to trusted roles:

    # security.yml
    access_control:
        - { path: ^/admin/composer, roles: ROLE_ADMIN }
    

Debugging & Logging

  1. Enable Debug Mode:

    php bin/console debug:config dflydev_embedded_composer
    
    • Inspect Composer configuration and service bindings.
  2. 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');
    
  3. Dry Runs: Test Composer commands without side effects:

    php bin/console embedded-composer:install --dry-run
    

Extending the Bundle

  1. 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');
        }
    }
    
  2. 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');
        }
    }
    
  3. 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
        }
    }
    

Gotchas and Tips

Pitfalls

  1. Symfony 2.x Only:

    • Error: Class 'Symfony\Component\DependencyInjection\Loader\YamlFileLoader' not found if using Symfony 3+.
    • Fix: Pin Symfony to 2.1–2.3 in composer.json:
      "symfony/symfony": "2.8.*"
      
  2. Composer 1.x Quirks:

    • Issue: Composer 1.x lacks modern features (e.g., composer.json schema validation).
    • Workaround: Manually validate composer.json before passing it to the bundle.
  3. PHP 5.3.2 Limitations:

    • Problem: No support for namespaces, traits, or modern PHP features.
    • Solution: Use a Docker container with PHP 5.6 + composer/composer:1.10 for compatibility.
  4. Service Container Conflicts:

    • Error: Service "dflydev_embedded_composer.composer" not found.
    • Fix: Ensure the bundle is loaded before other bundles that might override services.
  5. Lock File Handling:

    • Gotcha: The bundle may not respect composer.lock by default.
    • Fix: Configure explicitly:
      dflydev_embedded_composer:
          config:
              files:
                  - composer.json
                  - composer.lock
      
  6. Plugin Incompatibility:

    • Issue: Composer plugins (e.g., composer/installers) may not work.
    • Workaround: Use --no-plugins flag or manually install plugins.
  7. Memory Limits:

    • Problem: Embedded Composer may hit memory limits for large projects.
    • Fix: Increase PHP memory limit in php.ini
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
milito/query-filter
apiboxsym/user-bundle
apiboxsym/health-check-bundle
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui
babelqueue/php-sdk
facebook/capi-param-builder-php
babelqueue/symfony
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours