Sono in procinto di costruire un sistema di routing per scopi di apprendimento e ho riscontrato un problema che ritengo sia un po 'nell'area grigia delle migliori pratiche. Ragazzi, potete aiutarmi a decidere se questo è sbagliato, okay o potrebbe essere fatto in un modo diverso.
Quando si risolve una richiesta in arrivo e una risorsa di percorso è stata abbinata, il metodo di richiesta HTTP viene convalidato rispetto ai metodi HTTP supportati dalla rotta per garantire che sia in grado di gestire tali richieste. In caso contrario, viene generata un'eccezione di tipo UnsupportedMethodException
.
La documentazione del codice di stato HTTP indica che se un metodo di richiesta è negato / non supportato% L'intestazione diAllow
contenente un elenco di metodi supportati deve essere restituita nella risposta.
10.4.6 405 Method Not Allowed
The method specified in the Request-Line is not allowed for the resource identified by the Request-URI. The response MUST include an Allow header containing a list of valid methods for the requested resource.
Quindi per ovviare a questo ho pensato di estendere l'utilizzo dell'eccezione altrimenti generica per richiedere una matrice sequenziale di metodi supportati nel suo costruttore.
class UnsupportedMethodException extends \RuntimeException {
/**
* A sequential array of supported HTTP request methods.
*
* @var array $supported
*/
private $supported = [];
/**
* @param string $message The typical exception message.
* @param array $supportedMethods A sequential array of HTTP request methods the matched route supports.
* @param \Exception $previous Any previous exceptions
*/
public function __construct($message, array $supportedMethods, \Exception $previous = null)
{
parent::__construct($message, null, $previous);
$this->supported = $supportedMethods;
}
/**
* @return array
*/
public function getSupportedMethods()
{
return $this->supported;
}
}
Con l'uso del tipo hinting del blocco catch, ora ho un metodo solido per recuperare i metodi supportati e generare una risposta HTTP corretta.
Quindi la mia domanda è, pensate che sia una buona pratica? Qualcosa mi dice che la classe di eccezione non dovrebbe contenere tale logica, ma non ho alcuna prova / riferimento per eseguire il backup.