2016-11-23 96 views
0

我最近探討了Apigility我想使用HTTP DELETE方法刪除某個實體,但在刪除之前我需要驗證「entityId」必須被給出並且必須是Digit和trim。 問題是文檔提到:Zend Apigility:DELETE HTTP方法驗證

內容驗證當前僅適用於POST,PATCH和PUT請求。如果您需要驗證查詢字符串參數,則需要爲這些任務編寫自己的邏輯。 https://apigility.org/documentation/content-validation/intro 我必須做出的配置文件中的一些custome修改爲波紋管:

'NetworkingNightAPI\\V1\\Rpc\\DeleteSlotByLoginUser\\Controller' => [ 
    'DELETE' => 'NetworkingNightAPI\\V1\\Rpc\\AssignTimeSlotToLoginUser\\Validator', 
     ], 

正如我提到DELETE方法來驗證相同NetworkingNightAPI \ V1 \ RPC \ AssignTimeSlotToLoginUser \驗證,但問題是,它總是返回「的價值不能爲空「,即使我使用PostMan添加了有效的行JSON值

謝謝!

+0

使用郵差ENTITYID = 1,那麼它得到了驗證,但是當我通過排JSON在體內它的劑量不 –

回答

0

如果你想刪除一個資源,你應該使用url,它包括到該實體的路由。這意味着id將在您的路由參數中,而不是在您的查詢參數中。所以id是路由參數/標識符,並且RestController將使用資源監聽器的fetch($id)方法中的標識符搜索您的實體。如果具有該標識符的實體不存在,監聽器應該返回未找到的(404)響應。

您在問題中提到的內容驗證是用於驗證POST/GET參數的。所以在刪除請求的情況下不需要這樣的驗證器。

因此,例如說你要刪除Slot你將有一個路線:

api/v1/slots/[slot_id] 

如果你想刪除Slot ID爲1你需要發送刪除請求:

DELETE 
api/v1/slots/1 

如果Slotslot_id1不存在,您的聽衆應簡單地返回404響應。

0

我看你使用RPC而不是休閒的風格 - 如果你正在使用的查詢字符串傳遞參數,你必須自己驗證它的控制器內,例如:

public function someActionMethod() 
{ 
    $id = $this->getRequest()->getQuery('id'); 
    $validator = new Input('id'); 
    $validator->getValidatorChain() 
     ->attach(new \Zend\Validator\NotEmpty()) 
    ; 
    $validator->getFilterChain() 
     ->attach(new StringToUpper()) 
    ; 
    $inputFilter = new InputFilter(); 
    $inputFilter 
     ->add($validator) 
     ->setData($this->getRequest()->getQuery()) 
    ; 

    if(! $inputFilter->isValid()) { 
     return new \ZF\ApiProblem\ApiProblemResponse(
      new ApiProblem(400, $inputFilter) 
     ); 
    } 
} 

Apigility贏得不會使用通過UI生成的任何配置來驗證這些字段是否通過查詢字符串傳遞,正如它在文檔中所述 - 它們將被忽略。你需要自己生成valaidator。

如果您願意,可以將其設置爲使用配置生成驗證,然後在控制器中加載驗證程序,以節省上述寫入鍋爐板代碼。

+0

我寧願驗證config fi中的數據le –

+0

就像上面提到的apigility不會爲你加載它們一樣,你仍然需要讓驗證器自己加載配置中的數據。 – Andrew

0

謝謝您的回覆

我發現是Apigility使用「ZF-內容驗證」模塊用於驗證輸入數據(https://github.com/zfcampus/zf-content-validation

該模塊劑量沒有限制這樣的HTTP方法您可以將驗證應用於DELETE方法,就像它說的那樣

「在上例中,將爲PATCH,PUT或DELETE請求選擇Application \ Controller \ HelloWorld \ Validator服務,而Application \ Controller \的HelloWorld \ CreationValidatorw不適合POST請求。「

所以,你只需要在下面的配置文件中添加手動條目DELETE方法:

'NetworkingNightAPI\\V1\\Rpc\\DeleteSlotByLoginUser\\Controller' => [ 
      'input_filter' => 'NetworkingNightAPI\\V1\\Rpc\\DeleteSlotByLoginUser\\Validator', 
      'DELETE' => 'NetworkingNightAPI\\V1\\Rpc\\DeleteSlotByLoginUser\\Validator', 
     ], 

除了HTTP DELETE方法使用JSON行體從郵差你必須通過查詢參數不會驗證和你的控制器,你需要得到有效的使用插件象下面這樣的數據:當我通過ENTITYID作爲查詢字符串如

$recruiterId = $this->getInputFilter()->getValues()['recruiterId']; 
$timeSlotId = $this->getInputFilter()->getValues()['timeSlotId']; 
+0

相當肯定,不會工作:) – Andrew