Le due soluzioni sono entrambe valide, dipende da come vuoi affrontare il problema

Prima soluzione:
Possiamo dire che il compito del controller sarebbe quello di controllare i dati e quindi un metodo controllaDati() ci può anche stare.

Con operazioni semplici il controllo può essere veloce ma se i dati iniziano ad essere tanti e variabili le cose diventano difficili da gestire su un solo metodo

Da un punto di vista più SOLID

La seconda soluzione:
Codice PHP:
$utente=new Utente($_POST); 
è totalmente errata, ma impostandola diversamente può funzionare

Codice PHP:
$datiValidi = new ValidatoreDatiUtente($_POST); 
questa struttura ti porterebbe ad una gerarchia del tipo

abstract class Validatore
abstract class ValidatoreDati extends Validatore
class ValidatoreDatiUtente extends ValidatoreDati


Successivamente per continuare con l'esempio che hai proposto
Codice PHP:
//ci troviamo all'interno del controller
private function inserisci(){
  
$documento= new Modello();
  
$utente=new Utente($_POST);
  
$documento->setDocumento($utente);

Stai cercando di fare un inserimento nella tabella e il modello non ti serve.. il modello ti serve solamente in visualizzazione dei dati (quando fai i fetch delle righe) *vedi post successivo

un metodo generico di inserimento utente:
Codice PHP:
    public function insert() {
        
// il form di inserimento dati
        
$form = new view'user-add-form' );

        
// se qualcuno ha inviato dati dal form "user-add"
        
if ( isset( $_POST['user-add-form-submit'] ) ) {
            
// li valido tutti
            
$fv = new formValidator();
            
$fv->validateEmpty'email''The field [email] is required' );
            
$fv->validateEmpty'password''The field [password] is required' );

            
// se ci sono errori
            
if ( $fv->checkErrors() ) {
                
// creo il messaggio di errore
                
$message = new view'message'$fv->displayErrors(), array( 'class'=>'error-message' ) );
                
// lo attacco al form
                
$form->message $message;
                } else {
                
// se non ci sono errori
                // inserisco i dati nella tabella
                
$this->mapper->insert();

                
// creo il messaggio di inserimento avvenuto con successo
                
$message = new view'message'$this->mapper->getMsg(), array( 'class'=>'service-message' ) );
                
// lo attacco al form
                
$form->message $message;
            }
        }

        
// aggancio il form alla vista globale
        
$this->view->content $form;
    } 
nello specifico se vogliamo utilizzare il ValidatoreDatiUtenti

Codice PHP:
// bla bla

// se qualcuno ha inviato dati dal form "user-add"
if ( isset( $_POST['user-add-form-submit'] ) ) {
    
$validatore = new ValidatoreDatiUtente$_POST );

    if ( 
$validatore->hasError() ) {
        
// creo il messaggio di errore
        
} else {
        
// inserisco i dati
    
}

Tra le due meglio la seconda anche se più complessa della prima IMHO