# Using SingleShow for unique resources
Sometimes you will need to configure a "unique" resource that does not fit into a List / Show schema, like for instance an account, or a configuration item. To handle this kind of "unique" resource, Sharp provides a way to build SingleShows.
# Generator
php artisan sharp:make:single-show <class_name> [--model=<model_name>]
# Write the class
Instead of extending SharpShow
, our SingleShow implementation should extend Code16\Sharp\Show\SharpSingleShow
. We still have to implement buildShowFields()
and buildShowLayout()
to declare the fields presenting the instance, an optionally buildShowConfig()
, but the find()
method is different:
findSingle(): array
, without any parameter because in a single case the functional code has to determine the instance on its side (based on the current user, for instance).
# Single Commands
Declared Commands must also be implemented as single. Like for Shows, this only means extending a more specific abstract class: Code16\Sharp\EntityList\Commands\SingleInstanceCommand
. The two differences with regular InstanceCommand
are:
executeSingle(array $data = []): array
, which does not take any$instanceId
is parameterauthorize(): bool
, in case you need to define an specific authorization, instead ofauthorizeFor($instanceId)
.
# Single EntityState
Same for EntityState: in a SingleShow
case, you must implement EntityState as a Code16\Sharp\EntityList\Commands\SingleEntityState
, which differs a bit:
updateSingleState(string $stateId)
authorize(): bool
# Linking a SingleShow to the main menu
SingleShow can of course be linked in the menu:
config/sharp.php
return [
[...]
"entities" => [
[...],
"account" => [
"show" => AccountSingleSharpShow::class,
"form" => AccountSingleSharpForm::class,
]
],
"menu" => [
[...],
[
"label" => "My account",
"icon" => "fa-user",
"entity" => "account",
"single" => true
]
]
];
Nothing different on the entities
part, but do note the "single" => true
in the menu
to tell Sharp to treat this entity as a SingleShow.
# What if you need a Form?
Well, that's a SingleForm then.