catchadmin/core
CatchAdmin Core is the foundation package for the CatchAdmin Laravel admin framework, supplying shared utilities, base classes, and infrastructure for building backend management systems. It supports rapid CRUD scaffolding and permission handling, though community adoption remains limited.
Architecture fit. catchadmin/core is not a general-purpose Laravel library — it is the shared runtime layer of the CatchAdmin admin framework. It supplies base classes (Catch\Base\CatchController, Catch\Base\CatchModel), a route macro (Route::adminResource), an Excel import/export subsystem (Catch\Support\Excel\Import, AsyncTaskInterface + AsyncTaskDispatch), and a set of imposed conventions: unsigned-integer Unix timestamps for created_at/updated_at/soft-delete, enum values starting at 1, 1 = Enabled / 2 = Disabled status fields, creator_id in fillable lists, $fields/$form/$searchable/$dataRange model metadata, and setBeforeGetList() for list query shaping.
The fit is therefore narrow and conditional. It is a good fit if the requirement is "adopt CatchAdmin as our back-office platform." It is a poor fit if the requirement is "add an admin CRUD layer to our existing Laravel app," because core's value is inseparable from the surrounding module system (modules/{ModuleName}/, storage/app/modules.json, installer and service-provider stubs, codegen that writes Vue files into web/src/views/...). The decision to adopt is a platform decision, not a package decision, and should be framed that way to stakeholders.
Integration feasibility. Composer-installable and MIT-licensed, but not self-sufficient. Every documented flow assumes a project skeleton plus a separately cloned Vue frontend (gitee.com/catchadmin/catch-admin-vue, branch v5) and php artisan catch:module:install --all. The install guidance starts from "a project root containing composer.json" and defers to a manual-install reference — there is no visible standalone quickstart. Realistically, integration means forking or adapting a template repository, not composer require into a running product.
Technical risk. High, driven by ecosystem signals rather than any judgement of code quality:
| Risk | Signal | Severity |
|---|---|---|
| Abandonment / bus factor | 5 stars, 0 dependents, single release (2024-09-10) | High |
| Documentation shape | Chinese-first, written as agent skills rather than an API reference; no versioned docs for core alone | Medium-High |
| Frontend supply chain | Frontend lives on Gitee, branch-pinned v5, Node 22+/Yarn |
Medium |
| Ecosystem compatibility | Requires PHP 8.3+ and a recent Laravel; conventions diverge from Eloquent defaults | Medium |
| Lock-in via codegen | Generator writes controllers, routes, menus, and Vue pages into your repo | Medium |
| Tier ambiguity | Docs reference "CatchAdmin Pro"; relationship between MIT core and Pro is unstated | Medium |
Key questions to resolve before commitment:
catchadmin/core byte-identical to what ships inside CatchAdmin Pro, and does the MIT grant survive the free/Pro split for the modules we need?Route::adminResource collide with macros we already register, and how does it interact with Sanctum/Passport?$dataRange row-level permission filtering behave on large tables — is it SQL-side or post-filtered in PHP?Stack fit. PHP 8.3+, current Laravel, MySQL, Composer; Node 22+, Yarn, Vue 3 + Element Plus. This matches a conventional Laravel shop with a Vue frontend — no exotic runtime, no nonstandard infrastructure. The unfamiliar surface is convention, not technology.
Migration path. Three viable shapes, in descending order of preference:
CatchModel/CatchController usage to new modules only. Existing controllers keep Eloquent and standard route registration. Requires a written boundary rule and lint/review enforcement, because the framework's conventions will otherwise leak into legacy code.Do not plan a wholesale refactor of existing models onto CatchModel. The timestamp representation alone (integer Unix vs. Eloquent datetime) makes that a data-migration project with no product payoff.
Compatibility work items.
unsignedInteger created_at/updated_at/deleted_at. Existing tables almost certainly use timestamp. Either keep CatchAdmin models pointed at framework-native tables with explicit casts, or introduce views/adapter models at the boundary. Resolve this in the spike, not in sprint 4.1 = Enabled / 2 = Disabled versus common 0/1 or boolean flags. Plan a mapping layer; do not silently reinterpret existing rows.Route::adminResource; confirm no collision and that route caching still works.v5 branch and Yarn assumption are fixed constraints, not preferences.AsyncTaskInterface and AsyncTaskDispatch imply a queue worker. Confirm queue driver, worker capacity, and monitoring exist before enabling import/export in production.Sequencing (indicative, one senior Laravel dev plus part-time Vue):
storage/app/modules.json registration, menu/permission wiring, CI for both apps.CatchController), model with $fields/$form/$searchable, Route::adminResource before the //next marker, Vue list page with catch-table plus form/create.vue using useCreate/useShow and inject('closeDialog').modules/{Module}/Excel/Import/, $start matched to the real first data row, $importMaxNum respected, async path for large files, export classes under Excel/Export/.Budget roughly 9–11 weeks to a first production module with one experienced developer, plus part-time frontend. Assume an internal fork from day one rather than consuming upstream directly.
Maintenance. Plan to own the code. With 5 stars, zero dependents, and a single release in September 2024, the practical model is an internal fork you patch yourself and periodically rebase. Bug fixes, Laravel-major upgrades, and security patches to the framework layer become your backlog, not a vendor's. Additionally, codegen writes generated controllers, routes, and Vue pages directly into the repository, so any upstream generator change becomes a merge exercise across every module you have generated.
Support. No commercial support path is visible for the core package; the Pro tier may offer one — verify before signing off. Documentation is Chinese-first and structured as agent skills (catchadmin-backend, catchadmin-codegen, catchadmin-import, catchadmin-frontend, catchadmin-install, catchadmin-module, catchadmin-upload), which is genuinely useful as executable convention guidance but is not an API reference and will not answer "what does this method return." Assign named owners (one backend, one frontend) and convert the skill rules into internal ADRs so knowledge is not held by a single person.
Scaling. The underlying scaling story is conventional Laravel: horizontal app servers, a queue worker pool for AsyncTaskInterface jobs, standard DB tuning. Pressure points specific to this stack:
$dataRange row-level permission filters applied to list queries can produce expensive predicates on large tables — validate execution plans early and index creator_id and any scoped columns.catch-table tend to request wide column sets; pagination and column projection need to be deliberate.Failure modes to instrument and rehearse:
v5). Mirror it internally on day one; do not let a build depend on reachability of an external host.$dataRange either over-broadens visibility (a data incident) or over-narrows it (an apparent outage). Needs an explicit test matrix, not just a config review.route:cache and config:cache in the pre-deploy smoke test.Ramp-up. Laravel developers should reach productivity on core conventions in roughly one to two weeks, given the model metadata ($fields, $form, $searchable, $dataRange) and the thin-controller pattern. Vue developers typically need a few days on catch-table, useCreate, useShow, and the dialog closeDialog injection contract. The real onboarding cost is not the code — it is the absence of prose documentation. Schedule a half-day conventions workshop, record the output as internal documentation, and require every new module to match the nearest existing module's shape before introducing new patterns. Treat the first module as a training artifact: build it by hand, then verify codegen reproduces something equivalent.
How can I help you explore Laravel packages today?