Download the PHP package dillonsmart/tetherphp without Composer

On this page you can find all versions of the php package dillonsmart/tetherphp. 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 tetherphp

TetherPHP

Total Downloads Latest Stable Version License

Built with the help of Claude Code, in public.

Why

Most of the time spent on an application is spent reading it, and more and more often the reader is not the person who wrote it. It is a colleague picking up the code, or an AI agent working on it.

Frameworks tend to make that harder than it needs to be. Things get resolved by conventions nobody wrote down, dependencies get pulled from a container, and a request passes through layers of indirection before it reaches your code. If you know the framework's folklore, none of that is a problem. If you don't, every step is a "how did that happen?"

TetherPHP exists so that a request can be followed from route to response just by reading the code. If something matters, it is visible. A file's location follows from its name. A class is handed what it depends on. And the console can show you what the application does, so nobody has to guess. What makes the code obvious to a person makes it obvious to an agent too.

What it is

A small PHP framework built on the Action-Domain-Responder pattern. Each route has one Action, which calls a Domain that knows nothing about HTTP, and hands the result to a Responder that decides what the view gets.

It is opinionated about structure and deliberately narrow in scope. There is no ORM, no query builder, no validation layer and no container — those can be added as packages. What ships is routing, requests, responses, middleware and the console.

It is built in public, with Claude Code. An AI agent writes much of the code; the reasoning behind each change is in the commit messages, and the dev log records what broke and why. Development is posted on X at @DillonDevStuff.

What it looks like

This is the home page of a fresh install, end to end. A route names an Action:

The Action is constructed with the request and the application's services, builds its Domain and Responder, and connects them. It coordinates; it holds no logic and builds no markup:

The Domain does the work. It knows nothing about HTTP, takes what it needs through its constructor, and returns a value object rather than an array:

The Responder is the only place the view's variables are named. Rename $tagline in the template and the Domain does not change:

Nothing above is resolved by convention, discovered by scanning, or pulled from a container. Every arrow in Request → Route → Action → Domain → Responder → Response is a line you can point at.

Features

Requirements

Getting started

Create a project with Composer, then copy the example environment file:

Run it on PHP's built-in server, or in Docker:

php tether test runs the test suite, and php tether help lists every command.

Building assets

Styling is Tailwind CSS. Install the dependencies and build the stylesheet:

Project structure

Every feature is a directory. Actions\Home\Index lives at app/Actions/Home/Index.php, with its Domain, Result and Responder in the matching places. A second route is a second class beside the first — php tether make:action Home Show — never a second method on the same one.

The console generates that structure for you, and can report on it:

The framework itself is not part of this repository. It is installed as the dillonsmart/tetherphp-core Composer package and lives in vendor/dillonsmart/tetherphp-core.

Naming things

TetherPHP is opinionated about names, because a name is how you find a file and how the console finds it. There is one way, the generators write it, and the rules fit in a table. Note is the feature and Store is the operation throughout:

Thing Rule Example
Feature a singular noun in PascalCase; one directory of that name under Actions/, Domains/ and Responders/ Note
Operation a verb in PascalCase; one class per operation, with the same name in all three layers Actions\Note\Store, Domains\Note\Store, Responders\Note\Store
CRUD operations the seven verbs make:resource writes, and no others Index Create Store Show Edit Update Destroy
Result named for its shape, never for the operation; final readonly, under Results/, shared by every operation that answers the same way Domains\Note\Results\Record — used by Show and Edit alike
The result shapes Collection many, Record one, Written a change, Invalid a refusal, Page none of those handle(): Written\|Invalid
Collaborator a noun at the root of the feature's Domain namespace: shared by the operations, routed to by nothing Domains\Note\Notes (the queries), Domains\Note\Attributes (the rules)
View app/Views/pages/<feature>/<operation>.php, both lowercase; referred to in dot notation pages/note/create.php, $this->view('pages.note.create', …)
Partial app/Views/partials/<name>.php, kebab-case partials/note-form.php
Error view app/Views/errors/<status>.php errors/404.php
Route kebab-case URI, plural for a resource, {param} for a segment; make:resource --uri sets it /notes, /notes/{id}, /notes/{id}/edit
Command app/Commands/<Name>Command.php; invoked in kebab-case, or namespaced with a colon DbSchemaCommand → php tether db:schema
Services one class, App\Services at app/Services.php; a class of your own that it holds goes under app/Services/ App\Services\Mailer
Test tests/Unit/ for a Domain or Result on its own, tests/Feature/ for a request through the Kernel; <Subject>Test.php tests/Unit/AttributesTest.php, tests/Feature/NotesTest.php
Env key UPPER_SNAKE_CASE in .env, read with $env->get('DB_DSN') APP_NAME, DB_DSN

Three of those carry the rest:

The generators enforce all of it — php tether make:action Note Archive puts the file where the table says — and php tether context reports the conventions as JSON for anything that reads them by machine.

Documentation

The documentation covers routing, requests, responders, middleware, services, CRUD and the console. php tether help <command> explains any one command.

A complete example

This skeleton is a starting point, so its one feature does nothing. To see what a feature looks like with a database behind it, a form in front of it and input to refuse, read tetherphp-demo: a notes application built from this skeleton with tether make:resource, using SQLite through Services, with validation, a 422 that carries the form back, and feature tests through the real Kernel against an in-memory database. Its README says what to read in what order.

Working on the framework itself

Framework changes belong in the tetherphp-core repository, not here. To develop both together, clone them as siblings and point this application at your local core checkout:

That installs the core package as a symlink to ../tetherphp-core, so edits there take effect immediately with no reinstall. composer.local.json and composer.local.lock are gitignored, so the linked setup never leaks into a commit; composer.json continues to describe the real published dependency.

An alias helps:

To go back to the published package, remove the overlay and reinstall:


All versions of tetherphp with dependencies

PHP Build Version
Package Version
Requires php Version ^8.5
dillonsmart/tetherphp-core Version ^0.14
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 dillonsmart/tetherphp contains the following files

Loading the files please wait ...