nadar/php-composer-reader
Small PHP library to read and manipulate composer.json. Load and validate readability/writability, dump full content, and work with typed section readers (e.g., require, autoload PSR-4) to iterate packages/namespaces, inspect constraints, and add sections.
Installation
composer require nadar/php-composer-reader
First Use Case: Reading composer.json
use Nadar\ComposerReader\ComposerReader;
$reader = new ComposerReader();
$composerData = $reader->read(__DIR__ . '/../composer.json');
// Access data like a PHP array
echo $composerData['name']; // e.g., "vendor/package"
New Feature: Input from Array
$arrayInput = ['name' => 'test/package', 'version' => '1.0.0'];
$composerData = $reader->read($arrayInput); // Accepts array input directly
Where to Look First
ComposerReader now includes new methods for command output and array input handling.
read(string|array $path): Accepts either a file path or a PHP array.write(string $path, array $data): Saves modified data back to disk.merge(array $data): Merges new data into existing config.getCommandOutput(array $composerData): Generates CLI-compatible output (e.g., for composer show).Nadar\ComposerReader\Exception\InvalidComposerFileException for malformed files.Dynamic Dependency Management
$reader = new ComposerReader();
$composer = $reader->read('composer.json');
// Add a new dev dependency
$composer['require-dev']['phpunit/phpunit'] = '^9.0';
$reader->write('composer.json', $composer);
Array Input for Testing/Validation
$mockComposer = [
'name' => 'test/package',
'require' => ['laravel/framework' => '^10.0'],
];
$reader->read($mockComposer); // No file I/O needed
composer.json snippets without disk access.Generating CLI Output
$composer = $reader->read('composer.json');
$output = $reader->getCommandOutput($composer);
// Outputs formatted data like `composer show`:
// name : test/package
// version : 1.0.0
Configuration Overrides
$reader->merge([
'config' => [
'autoload' => ['psr-4' => ['App\\' => 'src/']],
],
]);
composer.json settings programmatically (e.g., in plugins).composer.json structure or generate CLI reports using getCommandOutput().read() with array input to manipulate composer.json in-memory before writing.composer.json data and generate CLI output dynamically:
public function register()
{
$this->app->singleton('composer', function () {
$reader = new ComposerReader();
return [
'data' => $reader->read(base_path('composer.json')),
'output' => $reader->getCommandOutput($reader->read(base_path('composer.json'))),
];
});
}
getCommandOutput(): Format composer.json data for human-readable output in logs or notifications.spatie/fork: Use array input to modify composer.json before forking packages.$base = $reader->read('composer.json');
$envOverrides = ['require-dev' => ['laravel/pint' => '^1.0']];
$merged = $reader->merge($envOverrides);
File Path vs. Array Input
read() now accepts both file paths and arrays. Passing an invalid array (e.g., missing "name") may not throw an exception unless explicitly validated.if (is_array($input) && !isset($input['name'])) {
throw new \InvalidArgumentException('Array input must include a "name" key.');
}
Data Merging Quirks
merge() still uses array_merge_recursive, which may overwrite arrays (e.g., require keys). Array input does not bypass this.array_replace_recursive for critical sections or manually merge:
$reader->merge(array_replace_recursive($composer, $newData));
JSON Validation
"version"). Array input skips file parsing but still requires manual validation.webmozart/assert or a schema validator:
assert(array_key_exists('version', $composer), 'Composer data must include a "version" field.');
Command Output Formatting
getCommandOutput() generates plain-text output. Custom formatting (e.g., ANSI colors) requires post-processing.$output = str_replace(':', ': ', $reader->getCommandOutput($composer));
var_dump($reader->read($arrayInput)); // For array input
var_dump($reader->read('composer.json')); // For file input
Custom Command Output
getCommandOutput() to support Markdown, JSON, or HTML:
class CustomComposerReader extends ComposerReader {
public function getJsonOutput(array $composerData): string {
return json_encode($composerData, JSON_PRETTY_PRINT);
}
}
Schema Validation for Arrays
composer.json schema using justinrainbow/json-schema:
$schema = json_decode(file_get_contents(__DIR__ . '/composer-schema.json'), true);
$validator = new \Justinrainbow\JsonSchema\Validator();
$validator->validate($arrayInput, $schema);
Event Dispatching for Array Input
if (is_array($input)) {
event(new ComposerArrayLoaded($input));
}
PHP 8.3+ Features
$reader->read(path: 'composer.json'); // Named argument (PHP 8.1+)
write() still overwrites files entirely. Use merge() for partial updates.$reader->merge([...$newData, 'config' => ['autoload' => [...]]]);
How can I help you explore Laravel packages today?