taoser/taoler
Taoler is a Laravel package for quickly building admin panels and management backends, with reusable CRUD scaffolding, authentication, and a permission-friendly structure to help teams ship internal tools and content workflows with less boilerplate.
First, reset expectations. taoser/taoler (TaoLerCMS) is not a Laravel package — it is a complete ThinkPHP 6 CMS application (企业站 / blog / mall / portal). You do not composer require it into an existing Laravel app. You deploy it as its own application and integrate at the HTTP/API boundary. Everything below assumes that stance.
Minimum path to a running instance:
pdo_mysql, mbstring, fileinfo, gd, curl, openssl).git clone https://github.com/taoser/taoler.git taoler
cd taoler && composer install
public/ (never the repo root) and make runtime/ and the upload directory (public/uploads or public/static/uploads, depending on version) writable by PHP..env.example → .env (or edit config/database.php directly on older builds), set host/name/user/pass and the table prefix.https://your-host/install (some builds expose /index.php/install). It imports the SQL schema and creates the first admin account./admin, then immediately delete or rename the installer directory.Where to look first
app/ — the ThinkPHP module tree. Expect admin/, index/ (front-end), api/, and shared code in common/. This mirrors Laravel's app/ only in spirit.route/ — URL rules. This is where pseudo-static/SEO URLs are defined; it is the closest analogue to routes/web.php.config/ — every knob (app.php, database.php, cache.php, template.php, route.php). There is no config/* publishing dance; you edit in place.app/index/view/ (or the active theme directory) — think-template files, not Blade.public/static/ — theme CSS/JS/assets.First real use case: stand TaoLer up on its own subdomain (e.g. cms.example.com) to own the marketing site / blog / product catalog, and consume it from your Laravel app via the bundled api module. That gives you a working editorial UI on day one without touching your Laravel codebase.
Treat TaoLer as a sidecar content service and most integration problems disappear.
1. Sidecar + headless pattern (recommended).
Run TaoLer behind its own nginx server block. Add a thin controller under app/api/controller/ (or a small addon) that returns JSON for the resources you care about — articles, categories, product lists — and guard it with a static token in a middleware. In Laravel, wrap it in a dedicated service class with Http::timeout(5)->retry(2, 200)->get(...), cache the result with Cache::remember('taoler:articles:...', 600, ...), and expose typed DTOs. This keeps Eloquent/Blade/queues in Laravel and content authoring in TaoLer.
2. Content sync / mirroring.
If you need local joins or search, run a scheduled Laravel command that pulls the API and upserts into Eloquent models. Keep a stable field map (id, cate_id, title, keywords, description, content, create_time, status) and store the raw payload in a json column so schema drift on the CMS side doesn't break you. Sync one-way, Laravel-read-only.
3. Same-domain routing.
If you must serve /blog/* from TaoLer under your Laravel domain, reverse-proxy it in nginx (location /blog/ { proxy_pass http://taoler-backend/; }) rather than mixing runtimes in one document root. Do not attempt to share PHP sessions — TaoLer's auth is its own session/permission implementation and will not interoperate with Laravel's auth.
4. SSO-lite for members.
Issue a short-lived HMAC-signed token from Laravel, verify it in a TaoLer middleware (in app/common/middleware/ or an addon) against a shared secret, and create/lookup the local member record. Keep TaoLer as the consumer of identity, never the issuer.
5. Extension via addons and hooks.
TaoLer's plugin model is string-keyed hooks: Hook::listen('some_hook', $params) registered from an addon's config. It is conceptually Laravel's events/listeners without the typed ergonomics. Prefer a single addon under the addons directory over editing core controllers — it survives git pull. For anything that touches autoloading, add a PSR-4 entry to composer.json (or place classes in extend/) and re-run composer dump-autoload.
6. Themes and templates. Front-end templates use think-template syntax, not Blade:
{volist name="list" id="vo"}
<a href="{:url('index/article/detail', ['id'=>$vo.id])}">{$vo.title}</a>
{/volist}
Keep your theme in a separate repo or submodule and symlink it into the theme directory so CMS upgrades don't clobber it.
7. Custom models as a content type builder. The admin "model management" feature creates tables and form fields without migrations — a lightweight Nova equivalent. Fine for CRUD content types; do not use it for anything your Laravel app must own transactionally.
8. Config as environment.
Put per-environment values in .env, override in config/*.php. There is no config:cache — but there is a runtime cache; see the gotchas.
9. Local development loop.
php think run starts the built-in server (the artisan serve analogue). Use php think clear to flush compiled templates and runtime cache. Keep APP_DEBUG=true locally, off everywhere else.
php artisan will do nothing here; the CLI is php think.NOASSERTION. There is no recognized OSI file in the repo metadata. Before using this commercially, get written clarification from the maintainer — this is the single biggest risk for a paid client engagement.public/. Exposing the repo root leaks config/, .env, and runtime/. Check your nginx root before anything else.config/ often needs to be writable during install, then should be read-only. Lock it down afterward.runtime/. Edits seeming to do nothing almost always mean stale compiled templates — php think clear and hard-refresh.runtime/log/YYYYMM/DD.log; check there before reaching for a debugger.prefix in the DB config is embedded in raw query strings in addons. Change it post-install and things break in ways that are painful to trace.index.php/ in every URL. Decide pseudo-static format before launch — changing it later invalidates indexed URLs and any API consumers that cached paths.vendor/ need explicit PSR-4 registration or extend/ placement, otherwise Class not found inside hooks.app/common.php, app/event.php, addons, and theme files rather than editing core controllers. There is no clean upgrade path; the only survivable strategy is git pull with zero local edits to tracked core files.APP_DEBUG=false in production and that runtime/ is not web-accessible.utf8mb4 and an explicit default_timezone in config/app.php — Chinese content plus emoji silently truncates on utf8.payload column from day one. TaoLer is a fine stopgap; it is not a place to build irreplaceable business logic.How can I help you explore Laravel packages today?