Come dire alla vista di creare un cookie?

2

Ho una classe LoginService con il metodo loginUser($email, $password, $remember = false) nel livello applicazione del mio livello modello.

Ora, se $remember è true , è necessario creare un cookie di accesso utente persistente sul browser del client, ma poiché questo è responsabilità della vista, quale è un buon modo per raggiungere la vista attraverso il controller per fai sapere che dovrebbe creare il cookie per questo?

    
posta Kid Diamond 08.09.2014 - 11:17
fonte

1 risposta

2

Una vista non dovrebbe toccare i cookie. La posizione dei dati memorizzati (cookie, database, tabella utente) è un dettaglio di implementazione che una vista non dovrebbe conoscere, in pratica un CRUD oggetto.

Anche registerUser($email, $remember = false) non è una buona firma del metodo. Cosa succede se devi passare più dati per uno dei casi più tardi? Questo è difficile da estendere. Scrivi in questo caso metodi diversi per azioni diverse, register_permanent( $email ) e register_temporary( $email ) in questo caso.

Anche il modello di registrazione non dovrebbe conoscere i cookie, perché i cookie sono dettagli di una richiesta web e il livello di output (web, console, qualunque sia) è un altro dettaglio di implementazione che non dovrebbe influire su altre regole aziendali. La registrazione conosce solo gli assegni da applicare per una registrazione. L'oggetto CRUD deve essere passato come dipendenza astratta (un'interfaccia), in modo da poterlo facilmente prendere in giro nei test delle unità.

Una soluzione eccessivamente semplificata potrebbe essere simile a questa:

interface Login_Status
{
    public function log_in( $name, $data );

    public function log_out( $name );

    public function get_data( $name );
}

class Login_Cookie implements Login_Status
{
    public function log_in( $name, $data )
    {
        setcookie( $name, $data, time() + 3600 * 24 * 30 );
    }

    public function log_out( $name )
    {
        setcookie( $name, '', time() + 3600 * 24 * 30 );
    }

    public function get_data( $name )
    {
        if ( ! empty ( $_COOKIE[ $name ] ) )
            return $_COOKIE[ $name ];

        return '';
    }
}

class User_Registration
{
    /**
     * @type Login_Status
     */
    private $login_Status;

    public function __construct( Login_Status $login_Status )
    {
        $this->login_Status = $login_Status;
    }

    public function register_permanent( $email )
    {
        // do something with $email, maybe this:
        $hash = hash( 'whirlpool', $email . 'some_salt' );
        // then …
        $this->login_Status->log_in( 'login', $hash );
    }
}

Questi modelli sono controllati da ... beh ... il controller. La vista non è affatto coinvolta.

Si potrebbe dire che le intestazioni HTTP vengono emesse e quindi le visualizzazioni. Questo di solito è corretto. Ma in questo caso, la vista sarebbe solo un involucro sottile attorno a setcookie() con un sovraccarico (una dipendenza da un modello). Per semplicità, non vorrei separare setcookie() .

    
risposta data 12.09.2014 - 23:09
fonte

Leggi altre domande sui tag