---
title: "Context and parameters"
description: "The data that an action gets from the action context, and the sources of its parameters: path, query or request body."
canonical: parameters.html
navigation-title: "Parameters"
---

<a id="context-and-parameters"></a>

# Context and parameters

- [Action context](#action-context)
- [Parameter sources](#parameter-sources)

<a id="developer-action-context"></a>

<a id="action-context"></a>

## Action context

A parameter of type `\TYPO3\CMS\Core\Action\ActionContext` is not part of
the public schema. TYPO3 supplies it, with these properties:

- **`$context->context`**

  The TYPO3 `Context`.
- **`$context->principal`**

  The authenticated user of the action.
- **`$context->translator`**

  A translator in the language of this user.
- **`$context->request`**

  The current request, if there is one.
- **`$context->scopes`**

  The scopes of the caller.

<a id="developer-parameters"></a>

<a id="parameter-sources"></a>

## Parameter sources

The values of route placeholders come from the path. For actions with a body
(`POST`, `PUT`, `PATCH`), the other parameters come from the JSON request body.
For all other actions, they come from the query. The attribute
`\TYPO3\CMS\Core\Attribute\ActionParameter` makes a parameter of an action
with a body a query parameter. Use this for arguments about the context of a
request, not about the submitted data, for example a workspace:

```php
use TYPO3\CMS\Core\Action\ParameterSource;
use TYPO3\CMS\Core\Attribute\ActionParameter;

public function perform(
    string $title,
    #[ActionParameter(source: ParameterSource::query)]
    ?int $workspace = null,
): void {
    // …
}
```

A parameter of type `\TYPO3\CMS\Core\Action\UploadedContent` gets the
content of an uploaded file, which the client sends as the raw request body. It
gives the content as `$content->stream`, its size and its media type from
the `Content-Type` header. An action can have one such parameter, and only for
the types `create`, `dispatch` and `replace`. The request can have any content
type. All other parameters are query parameters, and the OpenAPI document
describes the body as `application/octet-stream`. AI tools cannot send uploaded
content, so such an action must not have the target `Target::ai`:

```php
use TYPO3\CMS\Core\Action\Target;
use TYPO3\CMS\Core\Action\UploadedContent;

#[AsAction(
    route: 'my-extension/attachments',
    type: ActionType::create,
    targets: [Target::backend, Target::http],
)]
public function upload(UploadedContent $content, string $name): void
{
    // …
}
```
