xver/php-app-core
xver/php-app-core is a foundational PHP application package that centralizes common bootstrap, configuration, and infrastructure utilities. It helps Laravel/PHP projects share reusable core services, conventions, and maintainable application structure.
Treat this as a greenfield dependency: 0 stars and 0 dependents means you are the first integrator, and there is no blog post, Stack Overflow answer, or GitHub issue thread waiting to help you. Budget a half-day spike before it touches a real app.
composer require xver/php-app-core:1.2.3 # exact, no caret
composer show xver/php-app-core
vendor/xver/php-app-core/composer.json before anything else. This single file answers most of your questions:
require — does it constrain illuminate/* or php? A hard illuminate/support:^9 will silently hold your Laravel 11 app back.extra.laravel.providers / extra.laravel.aliases — if absent, there is no package auto-discovery and every wiring step is manual.autoload.psr-4 — confirm the namespace and check it does not collide with your App\ tree.vendor/xver/php-app-core/src/ and tests/ next. With no docs and no community, the test suite is the specification. If tests/ is empty or missing, treat every public method as undocumented and subject to change.php-app-core reads like a framework kernel/bootstrap package, which is often a peer to Laravel rather than a plugin for it.bootstrap/app.php or public/index.php until the spike is green.Adapter boundary (do this by default). Define your own contract in app/Contracts/, implement it in a thin class that delegates to the package, and bind it in a service provider. When the package breaks or you swap it out, you change one binding instead of grepping 40 call sites.
If it ships a ServiceProvider:
bootstrap/providers.php (Laravel 11+) or config/app.php (10 and below).php artisan vendor:publish --provider="Xver\PhpAppCore\...ServiceProvider". A committed config file turns every upstream default change into a reviewable diff.config/php-app-core.php and read them only via config(), never through the package's own config singleton — otherwise config()->set() in a test won't reach it.If it ships its own kernel or bootstrap sequence: treat it as a sidecar, not a plugin. Give it a standalone entry point (bin/worker.php) or its own container/process. Two bootstrappers running in one request is the classic failure mode: competing error handlers, competing set_exception_handler calls, and global state that leaks between them.
Testing: bind a fake implementation in tests/TestCase::setUp(). Never assert on package-internal objects — assert on your contract. This is what keeps the dependency swappable when the package goes quiet.
Upgrades: pin exact versions in composer.json, upgrade deliberately, and run the package's own test suite plus yours on your target PHP version before bumping. With zero dependents there is no canary population; you are the canary.
CI hardening: add composer audit, a PHP version matrix (8.1–8.4), and composer why-not xver/php-app-core <version> in your dependency-review job.
2026-10-14 is either a metadata artifact or a mis-tagged build; diff the Packagist version against the actual git tag (git log inside vendor/xver/php-app-core) before trusting the version number you pinned.illuminate/* constraints is common in low-adoption packages — it will install happily and then fail at runtime against a Laravel version it never tested. Verify by actually booting the app, not by composer require succeeding.ini_set, registers a global error handler, or defines constants at file scope, it will interact badly with Laravel's own bootstrap. Grep the source for ini_set, set_error_handler, define(, and $GLOBALS before integrating.composer show --all xver/php-app-core for the full version/dependency graph, then read the constructor of the main entry class — the constructor arguments are effectively the package's public contract.interface declarations in src/Contracts/, a config/ directory, and any event/dispatcher usage. If none of those exist, the package is meant to be used as-is and you should keep it at arm's length behind your adapter.How can I help you explore Laravel packages today?