extends |
RuntimeException |
|---|
A deployment error, and the one that used to be invisible: an artifact
carries an #[Access] or #[Act] attribute, its module is synced, but the
ability itself has no row in sdk_abilities — so the declaration has no id.
Before this existed, that resolved to null, and null is the resolver's word
for "this artifact declares no gate". The two states collapsed into one, and
the consumers — CheckAuthMiddleware and every AbstractSdkFormRequest — read
it as the Open Gate Philosophy: no gate, let it through. A freshly declared
gate therefore protected nothing until ui5:sync had run, and nothing said so.
The information was never missing; it was discarded. The resolver reflects the attribute first, so it knows the declaration exists, and then threw that fact away when the row lookup came back empty. Now it throws this instead.
Reached in the window between deploying code that adds a gate and running
ui5:sync — most easily on a zero-downtime deploy where the new revision takes
traffic before the chain runs, and on any developer machine where a new
attribute has not been synced yet.
| Methods | ||
|---|---|---|
public
static
|
for(string $namespace, AbilityType $type, string $ability): self
|
# |
| Methods inherited from Exception |
|---|
__construct(), __wakeup(), getMessage(), getCode(), getFile(), getLine(), getTrace(), getPrevious(), getTraceAsString(), __toString() |