Custom filters
It is super easy to create custom filters which will match your specific requirements.
Custom filters has to implement interface \SourceBroker\T3api\Filter\FilterInterface
and contain one public method filterProperty
.
Method filterProperty
accepts 4 arguments:
- $property (
string
) - Name of the property to filter by. - $values (
mixed
) - Values passed in request. - $query (
TYPO3\CMS\Extbase\Persistence\QueryInterface
) - Instance of Extbase's query. - $apiFilter (
SourceBroker\T3api\Domain\Model\ApiFilter
) - Instance of T3api's filter.
Important
Method filterProperty
has to return null
or instance of TYPO3\CMS\Extbase\Persistence\Generic\Qom\ConstraintInterface
.
If it returns null it won't affect the final result at all. If it returns ConstraintInterface
returned constraint will be added to final query.
Note
Keep in mind that second argument ($values
) is mixed type. Depending on requested URL it can be array or string.
If requests's query string contains property=hello
then $values
will be a string hello
.
If requests's query string contains property[]=hello
then $values
will be a array with one string inside (hello
).
Consider casting $values
to array inside your filter to avoid bugs ($values = (array)$values;
).
Example implementation of custom filter may looks as follows:
declare(strict_types=1);
namespace Vendor\Extension\Filter;
use SourceBroker\T3api\Domain\Model\ApiFilter;
use SourceBroker\T3api\Filter\FilterInterface;
use TYPO3\CMS\Extbase\Persistence\Generic\Qom\ConstraintInterface;
use TYPO3\CMS\Extbase\Persistence\QueryInterface;
class MyCustomFilter implements FilterInterface
{
public function filterProperty(string $property, $values, QueryInterface $query, ApiFilter $apiFilter): ?ConstraintInterface
{
return $query->equals($property, $values);
}
}
It may be useful, but not required, to extend class \SourceBroker\T3api\Filter\AbstractFilter
which will give you bunch of methods inside your filter. An example of such method may be addJoinsForNestedProperty
which may be really useful to handle more complex filters, especially when you need to implement something which is out of reach Extbase's query builder. Check code inside \SourceBroker\T3api\Filter\ContainFilter
and \SourceBroker\T3api\Filter\SearchFilter
for example usages.
declare(strict_types=1);
namespace Vendor\Extension\Filter;
use SourceBroker\T3api\Domain\Model\ApiFilter;
use SourceBroker\T3api\Filter\AbstractFilter;
use TYPO3\CMS\Extbase\Persistence\Generic\Qom\ConstraintInterface;
use TYPO3\CMS\Extbase\Persistence\QueryInterface;
class MyCustomFilter extends AbstractFilter
{
public function filterProperty(string $property, $values, QueryInterface $query, ApiFilter $apiFilter): ?ConstraintInterface
{
// ...
}
}
Note
Instance of your custom filter will be created using Extbase's ObjectManager, so you can inject into it any other services if you need them.
To use your new custom filter is it just needed to pass it as first parameter into @ApiFilter
annotation:
use SourceBroker\T3api\Annotation as T3api;
use Vendor\Extension\Filter\MyCustomFilter;
/**
* @T3api\ApiFilter(
* MyCustomFilter::class,
* properties={"username"},
* )
*/
class User extends \TYPO3\CMS\Extbase\Domain\Model\FrontendUser
{
}