2013-04-01 31 views
8

Attualmente sto lavorando su un sistema di risultati per un piccolo gioco online. L'entità realizzazione ha fondamentalmente 4 attributi:PHP: Verifica se un numero intero è in un determinato intervallo oppure no

  • id
  • earnedBy
  • earnedOn
  • progressi

l'ultimo dovrebbe essere una percentuale, significa un numero compreso tra 0 e 100 Per assicurarsi che nessun numero superiore a 100 o inferiore a 0 venga salvato nel database, il mio metodo setter sembra il seguente (sto usando Symfony2/Doctrine ORM):

public function setProgress($progress) 
    { 
     $this->progress = max(min($progress, 100), 0); 

     return $this; 
    } 

La linea importante qui è max(min($progress, 100), 0).

Funziona tutto bene, volevo solo chiedere, se c'è un'altra funzione built-in in PHP facendo esattamente quella cosa, e se quello che sto facendo va bene (in materia di buona-sviluppo di stile)

+1

io non credo che ci sia una tale funzione built-in per quello che ti serve, e quello che attualmente state facendo è perfettamente bene .. –

+0

Sembra buono. Probabilmente lo romperò in due righe invece di annidarlo per rendere la funzione max() min() più leggibile. –

+0

@ tereško, il contesto conta. Dato che sta usando il framework Symfony2, potrebbe esserci una soluzione più appropriata per il suo problema. – Gerry

risposta

3

È consigliabile aggiungere alcuni vincoli all'entità da the validation component a Symfony2.

use Symfony\Component\Validator\Constraints as Assert; 

class Achievement 
{ 
    /** 
    * @Assert\Range(min=0, max=100) 
    */ 
    protected progress; 
} 

Il servizio validator viene chiamato automaticamente quando, ad esempio la convalida forme, ma si può anche chiamare manualmente da ottenere il servizio validator, ad esempio nel controller.

$achievement = new Achievement(); 
$errors = $this->get('validator')->validate($achievement); 
+1

In realtà non si dovrebbe usare il contenitore DI di Symfony come semplice localizzatore di servizi. Potresti trovare [questa lezione] (http://www.youtube.com/watch?v=RlfLCWKxHJ0) piuttosto interessante. –

0

Breve la risposta è no, non esiste una funzione incorporata in PHP che "tronca" un numero ai limiti inferiore e superiore. Ed è proprio ok scrivere min(max(x, max_value), min_value) - è breve e leggibile.

1

È possibile utilizzare il Range vincolo:

use Symfony\Component\Validator\Constraints\Range; 

class Achievement 
{ 
    /** 
    * @Range(min=0, max=100) 
    */ 
    private $progress; 
} 

Validation in Symfony è gestita da un livello separato, così si dovrebbe non farlo in setter.

4

Poiché PHP 5.2 ci sono filter_var() funzioni con notevole serie di options disponibili.

Uno di loro consente di controllare il numero di essere in un intervallo:

$param = 10; 

$result = filter_var($param, FILTER_VALIDATE_INT, [ 
    'options' => [ 
     'min_range' => 20, 
     'max_range' => 40 
    ] 
]); 

var_dump($result); // will return FALSE for 10 

http://codepad.viper-7.com/kVwx7L

+0

+1 meglio dell'annotazione scadente – Baba

Problemi correlati