ray / compiler
A dependency injection compiler for Ray.Di
Installs: 1 009 100
Dependents: 5
Suggesters: 0
Security: 0
Stars: 5
Watchers: 4
Forks: 3
Open Issues: 0
Requires
- php: ^7.2 || ^8.0
- doctrine/annotations: ^1.8 || ^2.0
- doctrine/cache: ^1.10 || ^2.1
- koriym/attributes: ^1.0
- koriym/null-object: ^1.0
- koriym/param-reader: ^1.0
- koriym/printo: ^1.0
- ray/aop: ^2.14
- ray/di: ^2.18
Requires (Dev)
- ext-pdo: *
- bamarni/composer-bin-plugin: ^1.4
- phpunit/phpunit: ^8.5.41 || ^9.5
- 1.x-dev
- 1.11.0
- 1.10.6
- 1.10.5
- 1.10.4
- 1.10.3
- 1.10.2
- 1.10.1
- 1.10.0
- 1.9.2
- 1.9.1
- 1.9.0
- 1.8.0
- 1.7.0
- 1.6.0
- 1.5.1
- 1.5.0
- 1.4.1
- 1.3.7
- 1.3.6
- 1.3.5
- 1.3.4
- 1.3.3
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.3
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1.7
- 1.1.5
- 1.1.4
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- 0.3.0
- 0.2.0
- 0.1.5
- 0.1.4
- 0.1.3
- 0.1.2
- 0.1.1
- 0.1.0
- dev-wakeup-try-coverage100-but-failed
- dev-fiber
- dev-log_bindings
- dev-compile-log
- dev-construct
- dev-php8
This package is auto-updated.
Last update: 2025-02-04 01:34:34 UTC
README
Ray.Compiler
Pre-compile Ray.Di bindings to PHP code for maximum performance. The compiled injector runs faster than the standard injector by avoiding runtime reflection and binding resolution.
Installation
composer require ray/compiler
Usage
Ray.Compiler provides two main components:
Compiler
: Compiles Ray.Di bindings into PHP code.CompiledInjector
: High-performance injector that executes pre-compiled code.
Basic Usage
Pre-compile your dependencies:
use Ray\Compiler\Compiler; $compiler = new Compiler(); // Compile Ray.Di bindings to PHP files $compiler->compile( $module, // AbstractModule: Your application's module $scriptDir // string: Directory path where compiled PHP files will be generated );
Use the compiled injector:
use Ray\Compiler\CompiledInjector; $injector = new CompiledInjector($scriptDir); $instance = $injector->getInstance(YourInterface::class);
Compiler Integration
Create a compile script:
try { $scripts = (new Compiler())->compile( new AppModule(), __DIR__ . '/di' ); printf("Compiled %d files.\n", count($scripts)); } catch (CompileException $e) { fprintf(STDERR, "Compilation failed: %s\n", $e->getMessage()); exit(1); }
Add compile script to your composer.json
:
{ "scripts": { "post-install-cmd": ["php bin/compile.php"] } }
Docker Integration
Use multi-stage builds to maintain path consistency:
# Build stage FROM php:8.2-cli-alpine as builder # Set working directory WORKDIR /app # Install composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # Copy composer files first COPY composer.json composer.lock ./ # Install dependencies RUN composer install \ --no-dev \ --no-scripts \ --prefer-dist \ --no-interaction \ --optimize-autoloader # Copy application code COPY . . # Create non-root user RUN adduser -D appuser USER appuser # Compile DI code RUN php bin/compile.php # Production stage FROM php:8.2-cli-alpine # Create non-root user RUN adduser -D appuser # Set working directory WORKDIR /app # Copy only necessary files from builder COPY --from=builder /app/vendor/ ./vendor/ COPY . . COPY --from=builder /app/tmp/di/ ./tmp/di/ # Switch to non-root user USER appuser # Start command or other configurations can be added here
Docker Best Practices
When building your Docker images, it’s important to exclude unnecessary files to speed up builds, reduce image size, and prevent sensitive files from being included in the image. Below is a recommended .dockerignore
file. Adjust it to fit your project’s requirements:
# Ignore Git files
.git/
# Ignore dependency directories
/vendor/
/node_modules/
# Ignore compiled DI files
/tmp/di/
# Ignore environment-specific files
.env
.env.local
.env.*.local
# Ignore documentation and tests
/docs/
/tests/
# Ignore IDE-specific files
.idea/
.vscode/
# Ignore log files
*.log
# Ignore OS-specific files
.DS_Store
Thumbs.db
Version Control
Compiled DI code is considered an environment-specific build artifact and should not be committed to version control. This approach ensures that your repository remains clean and build artifacts do not cause merge conflicts or unexpected behavior across different environments.
Add the compile directory to your .gitignore
:
/tmp/di/