Weave 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

App Laravel Package

devdojo/app

DevDojo's Laravel application scaffold, intended as a starting point for apps built on the DevDojo stack. Adoption is minimal and documentation is sparse, so it suits experimentation and reference rather than production use.

View on GitHub
Deep Wiki
Context7

Getting Started

Set expectations first. devdojo/app is the internal application package behind the DevDojo product suite, not a general-purpose library. It has 2 stars, 0 dependents, and its last tagged release was October 2018 — squarely Laravel 5.6/5.7 era. Treat it as reference source code you happen to install, not as a maintained dependency. Budget time for reading vendor/thedevdojo/app rather than for reading docs, because there are none.

Step 1 — inspect before you install. Clone the repo and read composer.json for the laravel/framework constraint and the PSR-4 autoload map. That single file tells you whether the package will even resolve against a modern app:

git clone https://github.com/thedevdojo/app.git /tmp/devdojo-app
cat /tmp/devdojo-app/composer.json   # check require + autoload.psr-4
ls -R /tmp/devdojo-app/src | head -60

Look for the tell-tale package skeleton: a src/ namespace root, one or more *ServiceProvider.php files, a config/, database/migrations/, routes/, and resources/views/ directory. Those five directories define the entire public surface you will interact with.

Step 2 — install from VCS (it is unlikely to be comfortably resolvable from Packagist against a current Laravel):

{
  "repositories": [
    { "type": "vcs", "url": "https://github.com/thedevdojo/app" }
  ],
  "require": {
    "devdojo/app": "dev-master"
  }
}

Then composer update devdojo/app. If dependency resolution fails on the Laravel constraint, fork the repo, loosen the constraint to ^10.0|^11.0, and require your fork — do not use --ignore-platform-reqs as a permanent fix, it just defers the failure to runtime.

Step 3 — register and discover. If the package ships extra.laravel.providers, auto-discovery handles it. If not, add it to config/app.php providers manually. Then confirm registration actually took:

php artisan about                     # Laravel 9+
php artisan route:list | grep -i devdojo
php artisan vendor:publish --provider="DevDojo\App\AppServiceProvider"

First use case. The realistic entry point is not "install and use the features." It is: publish everything once, diff the migrations and routes against what already exists in your app, and decide whether you are (a) consuming the package as a dependency or (b) copying the relevant classes into app/ and abandoning the package boundary. For a 2018 package with 0 dependents, (b) is frequently the correct answer and saves you a future upgrade fight.

Implementation Patterns

Publish-then-own. The only durable pattern with an unmaintained package is to publish all assets on day one and commit them:

php artisan vendor:publish --provider="DevDojo\App\AppServiceProvider" --tag=config
php artisan vendor:publish --provider="DevDojo\App\AppServiceProvider" --tag=migrations
php artisan vendor:publish --provider="DevDojo\App\AppServiceProvider" --tag=views
php artisan vendor:publish --provider="DevDojo\App\AppServiceProvider" --tag=assets

Run vendor:publish with no tag first in a scratch branch to see the tag names it advertises. Once published, Laravel resolves the published copy, so local edits win and composer update cannot clobber them.

Migration ordering. Published migrations land with today's timestamp, which will place them after your existing schema. If the package's tables have foreign keys into users or into each other, rename the files to slot them into the right position, or wrap the FK creation in a separate migration. Run php artisan migrate --pretend to review the generated SQL before touching a real database.

Route surface control. Packages that ship their own routes usually register them unconditionally from the service provider, often with a prefix and middleware group. Wrap that in the provider's boot() inside a guard so you can disable it in non-frontend contexts (queue workers, console, Horizon):

// in your AppServiceProvider::boot(), before the package provider boots
if (! app()->runningInConsole() && config('devdojo.routes_enabled')) {
    // routes are registered by the package provider
}

More reliably: check whether the provider exposes a routes or loadRoutesFrom toggle in its published config, and if it does not, subclass the provider and override boot().

Config-driven overrides. Anything in the published config file should be read through config('devdojo.foo') at call time, not captured at boot. For a stale package, prefer env() only inside the config file itself — calling env() from package source breaks under config:cache, a very common 5.x-era bug.

Test containment. Because the package is old and untested against your stack, fence it:

// tests/Feature/DevDojoIntegrationTest.php — smoke test the surface you rely on
public function test_package_routes_respond(): void
{
    $this->get('/devdojo')->assertStatus(200);
}

Then add that route prefix to a Pest/PHPUnit group marked @group legacy so a failure clearly points at the package rather than at your application code.

Integration tip — facade and model access. If the package ships a facade alias in extra.laravel.aliases, prefer the fully-qualified class or a constructor-injected binding in your own code. Aliases registered by a package are easy to miss during a Laravel major upgrade and produce confusing "class not found" errors only in production.

Gotchas and Tips

No documentation is the primary gotcha. Assume nothing about the API. Read src/ and let the code be the spec — start with the service provider's boot() and register() methods; they enumerate every route file, config file, migration path, view namespace, and singleton binding the package provides. That is the whole map.

Autodiscovery may silently not fire. extra.laravel in composer.json only works if the key is present and well-formed. Verify with php artisan package:discover and check bootstrap/cache/packages.php. If the package predates discovery, composer dump-autoload alone will not register it.

config:cache breaks env() calls. In a 2018-era package, source code almost certainly calls env() directly. Symptom: works in php artisan serve, returns null in production. Fix by copying the env() lookups into the published config file and reading them via config().

Namespace collision on views. Packages load views with loadViewsFrom(__DIR__.'/../resources/views', 'devdojo') and expect view('devdojo::foo'). If your app already has a resources/views/devdojo/ directory, published views and package views can shadow each other. Check with php artisan view:clear and confirm which file view()->find('devdojo::...') resolves to before debugging anything else.

PHP version drift. Code from 2018 will hit deprecations on PHP 8.2+: dynamic property creation (Creation of dynamic property ... is deprecated), and possibly each(), create_function(), or ${var} string interpolation. Run php -d error_reporting=E_ALL artisan about and watch the deprecation stream before writing any code — these are cheap to fix and will otherwise surface as noisy 500s.

Migration re-run hazard. If the package's migrations are not guarded with Schema::hasTable(), migrate:fresh on a database that already ran them will fail. Wrap the package's up() bodies in an existence check, or delete the published files and rely on a schema dump.

Debugging checklist when a route 404s. In this order: route:list (is it registered?) → php artisan route:cache may be stale → check the prefix and middleware group in the provider → confirm the package provider is in bootstrap/providers.php / config/app.php. Nine times out of ten it is a stale route cache.

Extension points, in order of preference. (1) Published views — override the markup without touching PHP. (2) Published config — toggle features. (3) Container rebinding in your own AppServiceProvider::register() — $this->app->singleton(SomeInterface::class, MyImpl::class) if the package type-hints an interface. (4) Subclass the service provider and re-register it in place of the package's. Only edit files directly in vendor/ as a last resort, and if you do, fork immediately.

Verdict for day-to-day use. With 0 dependents and no release since 2018, this package receives no compatibility patches. If it provides a feature you need, plan to vendor the source into app/ (or a private split repo under your own namespace) within the first month. If you are evaluating it as a dependency for a new project on Laravel 11, the honest answer is that the integration cost exceeds the value — read it as a reference implementation of DevDojo's product architecture (models, billing flows, admin scaffolding) and borrow the parts you need.

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.
shitoudev/permissionmanager
johannesclimacus/laravel-tui
hocvt/seotools
vitalybaev/sypexgeo
amphibee/themosis-ignition
gito-me/fast-excel
frankyso/laravel-ipaymu
geolize-studio/laravel-chile
boomerangui/chat
jinas/dhivatar
store-doc/laravel-storage-driver
plus-it/laravel-translation-manager
diephp/perhaps
diephp/telegraph
osmaviation/spreadsheet
microsoft/fluentui-system-icons
mmccook/php-json-canonicalization-scheme
middlewares/firewall
qubiqx/montapacking
nyoncode/laravel-package-console