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

Context Service Extension Laravel Package

friends-of-behat/context-service-extension

Deprecated Behat extension that lets you register Behat context classes as Symfony DI services and load them into a scenario-scoped container via imported service config files (XML/YAML/PHP), using the fob.context_service tag.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require friends-of-behat/context-service-extension --dev
    
  2. Configure Behat Add the extension to your behat.yml with service file imports:

    default:
        extensions:
            FriendsOfBehat\ContextServiceExtension:
                imports:
                    - "%paths.base%/features/bootstrap/config/services.yml"
    
  3. Define a Context Service Create a service in services.yml with the fob.context_service tag:

    services:
        Acme\FeatureContext:
            tags:
                - { name: fob.context_service }
    
  4. Use in Suite Reference the service in your suite’s contexts_services:

    suites:
        default:
            contexts_services:
                - Acme\FeatureContext
    

First Use Case

Replace a traditional class-based context with a service:

// Before: Class-based context
class FeatureContext implements Context { ... }

// After: Service-based context (injected via DI)
class FeatureContext {
    public function __construct(private SomeDependency $dependency) {}
    public function someStep() { ... }
}

Implementation Patterns

Dependency Injection Workflow

  1. Service Definition Define contexts as services with dependencies:

    services:
        Acme\AuthContext:
            arguments:
                - "@auth_service"
                - "@logger"
            tags:
                - { name: fob.context_service }
    
  2. Scenario-Scoped Container Leverage the extension’s scenario-scoped container to manage context lifecycles:

    // Context service can access scenario-specific data
    class UserContext {
        public function __construct(private UserRepository $repo) {}
        public function iHaveAnAccount() {
            $this->repo->createTestUser(); // Scenario-scoped DB state
        }
    }
    
  3. Integration with Laravel

    • Service Providers: Register Behat services in AppServiceProvider:
      public function register() {
          $this->app->register(FriendsOfBehat\ContextServiceExtension\ContextServiceExtension::class);
      }
      
    • Configuration: Merge Laravel’s DI container with Behat’s:
      # behat.yml
      extensions:
          FriendsOfBehat\ContextServiceExtension:
              imports:
                  - "%paths.base%/config/behat-services.php"
      
      // config/behat-services.php
      $container->loadFromExtension('framework', ['secret' => env('APP_KEY')]);
      

Common Patterns

  • Context Initializers: Use context_initializers to set up services:
    services:
        Acme\Initializer:
            tags:
                - { name: fob.context_initializer }
    
  • Autoconfiguration: Enable autowiring for contexts:
    extensions:
        FriendsOfBehat\ContextServiceExtension:
            autoconfigure: true
    

Gotchas and Tips

Pitfalls

  1. Deprecation Warning

    • The package is deprecated; migrate to SymfonyExtension v2 for long-term support.
    • Use SymfonyExtension’s contexts key instead of contexts_services in newer versions.
  2. Service Lifecycle Mismatch

    • Context services are scenario-scoped, not globally shared. Avoid storing state across scenarios.
    • Debug with:
      // Dump container services in a context
      public function __construct(private ContainerInterface $container) {}
      
  3. Configuration Overrides

    • Service files (XML/YAML/PHP) are merged in order. Later files override earlier ones.

Debugging Tips

  • Validate Services: Use bin/behat -d to check loaded services.
  • Tag Verification: Ensure fob.context_service tags are correctly applied (check behat.yml logs).
  • Dependency Errors: Laravel’s container may conflict with Behat’s. Explicitly define services in Behat’s config.

Extension Points

  1. Custom Tags Extend with custom tags for conditional context loading:
    services:
        Acme\AdminContext:
            tags:
                - { name: fob.context_service, priority: 100 }
    
  2. Post-Initialization Use context_initializers to modify services after creation:
    class ContextInitializer implements ContextInitializer {
        public function initialize(ContextService $context) {
            $context->setOption('timeout', 30);
        }
    }
    
  3. Laravel-Specific
    • Service Binding: Bind Laravel services to Behat’s container:
      $this->app->when(FriendsOfBehat\ContextServiceExtension\ContextService::class)
          ->needs('logger')
          ->give($this->app->make('log'));
      
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.
nasirkhan/laravel-sharekit
directorytree/privacy-filter-classifier
directorytree/privacy-filter
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony
develia/geo-bundle
dreamzy/livewire-charts
touchestate-sdk/php-sdk
22h/doctrine-garbage-collection-bundle
agtp/agtp-php
agtp/mod-php
splash/sonata-admin
splash/metadata
splash/openapi
splash/scopes
splash/toolkit
testo/output-teamcity
testo/bridge-symfony