drahak/restful – kde se odchytává validace

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Miri
Člen | 117
+
0
-

Ahoj,

snažím se vytvořit rest api přes drahak/restful a není mi úplně jasné, kde a jak se vrací validace. Viz níže, když zadám špatné heslo. Vrátí mi to warning: strpos(): Empty needle, když vypnu laděnku, tak to projde ale vrátí mi to xml root. Jak docílit toho aby mi to vrátilo např json a kde se to obsluhuje?

class CrudPresenter extends BasePresenter
{

	public function validateCreate()
    {
        $this->input->field('password')
            ->addRule(IValidator::MIN_LENGTH, NULL, 3)
            ->addRule(IValidator::PATTERN, 'Please add at least one number to password', '/.*[0-9].*/');
    }

    public function actionCreate()
    {
		$this->resource->message = isset($this->input->password) ? $this->input->password : 'no message';
        $this->resource->action = 'Create';
    }

PS: není někde veřejně již hotová rest api k nakouknutí?
Děkuji za odpověď
Míra

Tomáš Jacík
Člen | 147
+
0
-

Zkus jestli nepomůže do té chybové zprávy přidat placeholder pro pattern. Já to používám takto:

$field->addRule(IValidator::PATTERN, "Filter {$parameter->name} must be in format '%s'.",
                $parameter->pattern);

Také vyfiltrovaný input si raději získávám přes:

$inputData = $this->getInput()->getData();

a pak se to dá hromadně projít, nebo to předat něčemu, co to projde. Takto to používám v Presenteru:

<?php

namespace App\ApiV2Module\Presenters;

use App\ApiV2Module\Mappers\CampaignMapper;
use App\ApiV2Module\Validators\CampaignsDefaultValidator;
use App\Model\Repositories\PAN\CampaignRepository;


/**
 * @secure
 */
class CampaignsPresenter extends BasePresenter
{
    /**
     * @var CampaignRepository
     * @inject
     */
    public $campaignRepository;

    public function validateDefault()
    {
        CampaignsDefaultValidator::createValidations($this->getInput());
    }

    public function actionDefault()
    {
        $fields = $this->requestFilter->getFieldList();

        try {
            $campaignMapper = new CampaignMapper($fields);
        } catch (\InvalidArgumentException $e) {
            // Detected unknown fields
            $this->sendErrorResource($e);
        }

        $campaigns = $this->campaignRepository->findAll()
            ->where('advertiserid', $this->getUser()->getIdentity()->advertiserId);

        $inputData = $this->getInput()->getData();
        foreach ($campaignMapper->getConditions() as $name) {
            if (!array_key_exists($name, $inputData)) {
                continue;
            }
            $condition = $campaignMapper->formatCondition($name, $inputData[$name]);
            $campaigns->where($condition[0], $condition[1]);
        }

        $count = $campaigns->count('*');
        $this->paginator->setItemCount($count);

        $campaigns->select(implode(',', $campaignMapper->getFieldsForSelect()))
            ->order($campaignMapper->formatSort(isset($inputData['sort']) ? $inputData['sort'] : NULL))
            ->limit($this->paginator->length, $this->paginator->offset);

        $this->resource = [
            'campaigns'  => $campaignMapper->processResult($campaigns),
            'totalItems' => $count,
        ];
        $this->sendResource();
    }

}

Jasně, zdaleka to není ideální způsob. Já teda obecně drahak/restful nepovažuju za dobře napsanou libku. Ten ResourcePresenter je napsaný nad klasickým Nettím UI\Presenter, tedy obsahuje spoustu pro API zbytečného balastu. Mám rozepsaného něco svého, čím to chci nahradit, co je psané low-level nad vlastním PresenterComponent. Co je z té libky dobré jsou validace, ty by ale bylo fajn vyčlenit do samostatného HttpValidations balíčku. Pokud máš čas a chuť se tomu věnovat a udělat to správně, mohu poskytnout co mám a nasměrovat.