Download the PHP package kdr-dev/dissect without Composer

On this page you can find all versions of the php package kdr-dev/dissect. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package dissect

🩺 dissect

Visualise your Eloquent models and their relationships as an interactive graph.

Point it at your models directory and open a page: every model becomes a node with its columns, every relation becomes an edge. Drag nodes into an arrangement that makes sense, and the layout is saved to a file you can commit so your team sees the same picture.

πŸš€ Quick start

Not on Packagist, so install it straight from GitHub. From your application's root:

Then visit /dissect in your local environment. That's it β€” the service provider is auto-discovered, and there is nothing to publish or build. πŸŽ‰

πŸ’‘ Composer resolves packages by tag. To track the unreleased tip instead β€” or if no tag has been pushed yet β€” ask for the branch: composer require kdr-dev/dissect:dev-main --dev.

πŸ”‘ SSH works too if you prefer it β€” swap the URL for [email protected]:kadirtikil/dissect.git.

βœ… Requirements

Laravel 13 is a hard floor, and deliberately so. Column and relation discovery is delegated to the framework's own ModelInspector (the class behind artisan model:show), and the endpoint surface reads laravel-json-api/laravel schemas, whose current release does not support anything earlier. Supporting one framework version well is worth more here than supporting three thinly.

πŸ“¦ Installation

The quick start above uses composer config, which writes the repository entry for you. To do it by hand instead, add this to your application's composer.json:

Then:

Publishing the config file is optional:

βš™οΈ Configuration

Everything is configurable through environment variables, so the published config file is usually unnecessary.

Variable Default Purpose
DISSECT_ENABLED unset Unset means "on in local only". Set to true/false to decide explicitly.
DISSECT_PATH dissect URL prefix the viewer is served from.
DISSECT_MODELS_PATH app/Models Directory scanned for models. Relative paths resolve from the base path; absolute paths are used as given.
DISSECT_MODELS_NAMESPACE inferred Set this when your namespace does not follow the conventional app/Models β†’ App\Models mapping.

The rest are config-file only:

πŸ“ Models outside app/Models

For a domain-oriented or monorepo layout, set both the path and the namespace:

πŸ” What actually keeps this off your production boxes

Worth being precise, because it is easy to assume more protection than there is. The provider is auto-discovered and boots on every request in every environment where the package is installed. One thing decides whether the routes register:

So the gate is APP_ENV. Two things have to hold, and dissect controls neither of them:

  1. Production deploys with composer install --no-dev, so a --dev install is genuinely absent. This is your deploy command, not something the package can enforce.
  2. APP_ENV is not local there, and DISSECT_ENABLED was not left switched on after somebody debugged something.

Break either β€” a staging box left at APP_ENV=local, a deploy that installs dev dependencies β€” and the viewer is live. Unauthenticated, it serves your full schema, every route, every validation rule, and accepts two POSTs that write into your project root.

If you enable it anywhere but your own machine, the middleware is the control that holds when the environment check does not:

🧷 Upgrades and your files

.dissect/layout.json and .dissect/views.json are yours, and they live in your project rather than vendor/, so composer update cannot touch them.

Both files record the format version they were written in, and dissect will not rewrite a file written by a newer version than the one you are running β€” it reads it, renders what it understands, and refuses the save with a message rather than quietly replacing your layout with the subset it recognised. If a future release does change the format, your file is copied to .dissect/layout.json.v1.bak before the first migrating write. An unparseable file is copied to .dissect/layout.json.corrupt.bak before being replaced.

Nothing here needs an upgrade step from you. It is worth knowing the refusal exists, so that "layout not saved" on a machine running an older dissect reads as a version mismatch rather than a bug.

πŸ—‚οΈ Views

A large schema is easier to read a slice at a time. Pick the models you want β€” shift-drag the canvas, or tick them in the View menu's model list β€” name the selection, and it is saved to .dissect/views.json as a named view you can switch to whenever you like.

πŸ›£οΈ Routes

The Routes tab is the other half of the same question. The graph says what your data looks like; this says how you reach it: every endpoint, what a request must carry, and what comes back.

🧩 JSON:API

Applications built on laravel-json-api get their shapes from their schemas, since every route the package registers runs the same generic controller and a return type would say nothing.

🎯 Where the shapes come from

Requests are read from a FormRequest's rules() where one is type-hinted, and from an inline $request->validate([…]) otherwise. Responses are read from the return type and the toArray() of whatever JsonResource it names, nested resources included.

Nothing in Laravel can be asked what an endpoint returns, so some of this is read from your source rather than run. Each shape says which:

Confidence Meaning
certain The framework itself produced it β€” rules() ran, or the resource declared its model with @mixin.
inferred Read from the source. Usually rules() could not run outside a request, or the resource never declared what it wraps.
unknown The class was found but its shape could not be read. Treat it as incomplete.

A confidently wrong API description is worse than none, so this is shown rather than smoothed over.

⏱️ Jobs

The Jobs tab answers the question a 202 Accepted leaves behind: what is going to happen next, where, and carrying what. Jobs, queued listeners, mailables and queued notifications all end up on the same worker, so they are all here β€” found by the ShouldQueue interface rather than by which folder they sit in.

🎯 Where the queue name comes from

A job that uses Laravel's Queueable trait cannot declare a public $queue property β€” PHP rejects it as an incompatible redefinition β€” so most jobs name their queue somewhere else. All of those places are read, and the tab says which one answered:

Source Meaning
property A declared $queue. The usual form for a queued listener, which inherits nothing that claims the name.
constructor $this->onQueue('…') among the constructor's own statements. Not one inside an if: a queue that depends on the arguments is not one this can report.
dispatch The class named none, and exactly one dispatch site chained ->onQueue('…').
mixed Two sites named two different queues. Picking one would invent a fact.
default Nothing anywhere named one.

Nothing is executed to find this out. backoff() and middleware() are read as source too β€” a middleware() returning new WithoutOverlapping($this->order->id) on an unconstructed job would be a fatal error, and describing your code must never be able to cause one.

πŸ“‘ Queue

Every other tab describes your code. This one describes your queue, right now β€” so it is polled rather than fetched, never cached at either end, and it is the only page here that goes stale the moment you look away.

Three tenses, because that is how anyone asks about a queue:

πŸ•³οΈ The gap you should know about

Laravel keeps no record of a job that succeeded. It is queued, it runs, it is deleted, and nothing anywhere remembers it β€” which is precisely why Horizon exists. So "what was in the queue" means what failed and what was batched, and an empty history means nothing failed, not that nothing ran. The tab says this on the page rather than letting you infer it from a blank list.

πŸ”’ What it will not do

The queue payload carries data.command β€” a serialised instance of your job. dissect never unserialises it. Doing so would construct your objects, run their __wakeup, and on a SerializesModels job go to the database for every model it carries; a tool that describes a queue must not be able to change one. Only the JSON envelope is read, and the payload itself is never put on the page.

🌲 Providers

The Providers tab reads each service provider in your application and draws what it decides: the contracts it binds, what they resolve to, and β€” following constructor type-hints β€” what those classes need in turn.

πŸ•³οΈ What it cannot see

Nothing is booted to find this out β€” registering a provider to watch what it binds would connect whatever its singletons connect to. So only what is written literally can be named. A binding built in a loop, a class name in a variable, or a binding tucked into a helper method is still seen, and shows up as a dotted "unresolved" box with the code as written, under a banner saying the tree is not fully analysed. A tree cut short by max_depth or max_nodes says that too.

The walk stops at framework and package code: Illuminate\Filesystem\Filesystem gets a box, and its own constructor is not read. A contract your provider type- hints but does not bind is a leaf β€” some other provider decides it, and guessing which would be reporting the running container as a fact about your source.

Only your own providers are listed. bootstrap/providers.php and the providers packages register run into the hundreds and are nearly all vendor code.

πŸ” How it works

See ARCHITECTURE.md for the full design.

πŸ› οΈ Contributing

The package develops against Orchestra Testbench, with a Workbench application in workbench/.

The fixture in workbench/app/Models is small on purpose β€” it covers every relation family and column kind, and the tests assert against it. 🐘 workbench/app/Http and workbench/routes do the same job for the endpoint list: a form request whose rules() cannot be run, a resource with no model behind it, a closure route, an invokable controller. composer serve:huge generates the opposite fixture, a schema large enough to show what layout, the minimap and saved views do under load.

⚑ Frontend hot reload

composer serve:hmr in one terminal and pnpm dev in another runs the real Laravel host with the frontend served from Vite, so frontend edits hot-reload while the PHP side stays genuine.

🏷️ Releasing

dist/ is committed on purpose β€” it is the compiled bundle the Composer package serves, and the whole promise is one composer require with no build step in the host application. So every release must rebuild it:

⚠️ A tag that ships a stale dist/ ships a stale UI to everyone who installs it.

πŸ“„ License

MIT. See LICENSE.


All versions of dissect with dependencies

PHP Build Version
Package Version
Requires php Version ^8.3
illuminate/database Version ^13.0
illuminate/routing Version ^13.0
illuminate/support Version ^13.0
nikic/php-parser Version ^5.0
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package kdr-dev/dissect contains the following files

Loading the files please wait ...