The entity class

An entity is simply a data structure which has a meaning in the application context. For instance, a Person, a Post or an Order. It's typically a Model — but it's not necessarily a 1-1 relationship, a Sharp entity can represent a portion of a Model, or several Models.

The entity class is the place where you can declare the entity configuration: its Entity List, Form, Show Page...

Write the class

The class must extend Code16\Sharp\Entities\SharpEntity. The easiest way to declare your attached classes is to simply override a bunch of protected attributes:

class SpaceshipEntity extends SharpEntity
    protected ?string $list = SpaceshipSharpList::class;
    protected ?string $show = SpaceshipSharpShow::class;
    protected ?string $form = SpaceshipSharpForm::class;
    protected string $label = "Spaceship";

Here is the full list:

  • $list, $show, $form and $policy may be set to a full classname of a corresponding type. The following sections of this documentation describe all this in detail, allowing you to build your Sharp backend.
  • string $label is used in the breadcrumb, as a default (see the breadcrumb documentation for more on this). You can simply put your entity name here.
  • bool $isSingle must be set only if you are dealing with a single show
  • and finally array $prohibitedActions can be use to set globally prohibited actions on the entity, as documented here.


Dashboard only needs to override one protected attribute: $view: Note that the class extends SharpDashboardEntity, not SharpEntity.

class TravelsDashboardEntity extends SharpDashboardEntity
    protected ?string $view = TravelsDashboard::class;

Override methods instead

If you need more control, you can override these instead of the attributes:

protected function getList(): ?string {}
protected function getShow(): ?string {}
protected function getForm(): ?string {}
protected function getPolicy(): string|SharpEntityPolicy|null {}

Note that the last one, getPolicy, allows you to return a SharpEntityPolicy implementation instead of a classname, as it's sometimes easier to declare a quick policy right in here. Fot instance:

class MyEntity extends SharpEntity
    // [...]

    protected function getPolicy(): string|SharpEntityPolicy|null
        return new class extends SharpEntityPolicy
            public function update($user, $instanceId): bool
                return $user->isBoss();

Handle Multiforms

This is a dedicated topic, documented here.

Last Updated:
Contributors: philippe, Arnaud Becher, Marcin Ławniczak