Yii2: Validierungsregel für Array?

Lesezeit: 3 Minuten

Benutzeravatar von robsch
robsch

Ich kann eine Regel für eine einzelne Ganzzahl wie folgt definieren:

[['x'], 'integer']

Kann man sagen, dass x ein ganzzahliges Array ist? Zum Beispiel:

[['x'], 'integer[]']

Und könnte ich die gültigen Werte im Array angeben?

Aktualisieren: Ab Yii Version 2.0.4 haben wir etwas Hilfe bekommen. Siehe diese Antwort.

  • Ist das für Modellregeln? Sie können ein Array nicht wirklich speichern, vielleicht eine Serialisierung davon. Willst du versuchen, dich etwas klarer auszudrücken?

    – Kasraf

    2. Dezember 2014 um 15:26 Uhr


  • In meinem Fall ist es ein Modell für ein Formular, das einige Checkboxen enthält, die als Array geladen werden (mit $modal->load(Yii::$app->request->post()), also nicht für ein ActiveRecord-Objekt .

    – robsch

    2. Dezember 2014 um 15:49 Uhr

  • @Chen Asraf Sie können ein Array speichern, wenn Sie es verwenden mongodb

    – sehr böser Fehler

    4. März 2015 um 3:11 Uhr

Benutzeravatar von robsch
robsch

Ab Version 2.0.4 gibt es das Neue JederValidator das macht es jetzt einfacher:

['x', 'each', 'rule' => ['integer']],

Dies sollte ausreichen. Sollen die Werte auch überprüft werden, könnte man dies (mit der ‘in’-Validator was eigentlich der RangeValidator ist):

['x', 'each', 'rule' => ['in', 'range' => [2, 4, 6, 8]]], // each value in x can only be 2, 4, 6 or 8

Sie können diesen ‘in’-Validator aber auch direkt verwenden. Und das ist mit Yii-Versionen vor 2.0.4 möglich:

['x', 'in', 'range' => [2, 4, 6, 8], 'allowArray' => true]

Die Verwendung von 'strict' => true würde wohl keinen sinn machen falls die daten vom client gesendet und mit gesetzt werden Modell->laden(). Ich bin mir nicht ganz sicher, aber ich denke, diese Werte werden alle als Zeichenfolgen gesendet (wie “5” anstelle von 5).

  • [‘x’, ‘each’, ‘rule’ => [‘in’, ‘range’ => [2, 4, 6, 8]]]funktioniert nicht, wenn x ein Array von Ints ist (kein Skalartyp). Es sollte so vorgehen, wie Sie es unten beschrieben haben [‘x’, ‘each’, ‘rule’ => [‘in’, ‘allowArray’ => true, ‘range’ => [2, 4, 6, 8]]]. Ich habe einige Zeit damit verbracht, zu definieren, wo genau ich etwas falsch mache. Trotzdem danke für deine Antwort

    – Yehor

    14. April 2016 um 5:30 Uhr


  • [‘x’, ‘each’, ‘rule’ => [‘integer’]]Ich verwende genau diese Zeile in meinem SearchModel, aber es funktioniert nicht … Es scheint die Regel zu ignorieren … Warum?

    – webpaul

    3. Februar 2017 um 11:09 Uhr

  • @webpaul Schwer zu sagen. Erstellen Sie eine neue Frage mit detaillierten Informationen.

    – robsch

    3. Februar 2017 um 12:28 Uhr

Benutzeravatar von Ali MasudianPour
Ali MasudianPour

Möglicherweise müssen Sie benutzerdefinierte Validierungsregeln wie folgt erstellen:

['x','checkIsArray']

Dann in Ihrem Modell, impelement checkIsArray:

public function checkIsArray(){
     if(!is_array($this->x)){
         $this->addError('x','X is not array!');
     }
}

Sie können alles, was Sie brauchen, in eine benutzerdefinierte Validierungsregel einfügen.


Wie emte Im Kommentar erwähnt, können Sie auch den Inline-Validator mit anonymer Funktion wie unten verwenden:

['x',function ($attribute, $params) {
    if(!is_array($this->x)){
         $this->addError('x','X is not array!');
     }
}]

  • Das klingt vernünftig!

    – robsch

    2. Dezember 2014 um 15:50 Uhr

  • Wenn Sie keine neue Funktion angeben möchten, können Sie die anonyme Funktion direkt in der Regel verwenden

    – emte

    2. Dezember 2014 um 16:41 Uhr

  • Es ist besser zu verwenden is_array($this->$attribute). Dies ist nützlich, wenn Sie mehrere Attribute in dieser Regel haben.

    – sehr böser Fehler

    4. März 2015 um 2:08 Uhr

Benutzeravatar von Yehor
Yehor

Wenn Sie für jedes Array-Element einen bestimmten Bereich prüfen müssen

['x', 'required'] 

Plus

['x', 'each', 'rule' => ['in',  'allowArray' => true, 'range' => [2, 4, 6, 8]]]

oder

['x', 'in', 'allowArray' => true,  'range' => [2, 4, 6, 8] ]  

1405010cookie-checkYii2: Validierungsregel für Array?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy