2013-01-07 8 views
6

Un client richiede che tutte le richieste GET/POST vengano registrate e archiviate per 90 giorni per la loro applicazione. Ho scritto un HOOK che sembra registrare alcuni dei GETS/POSTS ma ci sono meno dati di quanto mi aspetterei. Ad esempio, quando si inviano i dati del modulo, le voci non sembrano essere inserite nel registro. Qualcuno ha scritto qualcosa di simile che funziona?Codeigniter - Hook per registrare GET/POST REQUEST

Ecco la mia versione finora:

class Logging { 

    function __construct() { 
     $this->CI =& get_instance(); 
    } 

    function index() { 
     $this->CI->load->model('Logging_m'); 
     $this->CI->load->model('Portal_m'); 

     //get POST and GET values for LOGGING   
     $post = trim(print_r($this->CI->input->post(), TRUE)); 
     $get = trim(print_r($this->CI->input->get(), TRUE)); 

     $this->CI->Logging_m->logPageView(array(
       'portal_id' => $this->CI->Portal_m->getPortalId(), 
       'user_id' => (!$this->CI->User_m->getUserId() ? NULL : $this->CI->User_m->getUserId()), 
       'domain' => $_SERVER["SERVER_NAME"], 
       'page' => $_SERVER["REQUEST_URI"], 
       'post' => $post, 
       'get' => $get, 
       'ip' => $this->CI->input->ip_address(), 
       'datetime' => date('Y-m-d H:i:s') 
     )); 
    } 

} 

Questi dati vengono memorizzati in un modello chiamato 'Logging_m' che assomiglia a questo:

<?php 
class Logging_m extends CI_Model { 

    function __construct() { 
    parent::__construct(); 
    } 

    function logPageView($data) { 
    $this->db->insert('port_logging', $data); 
    } 

} 

/* End of file logging_m.php */ 
/* Location: ./application/models/logging_m.php */ 
+0

puoi pubblicare il modulo a cui mancano le sue azioni. –

+1

Interessante domanda +1. Puoi fare un var_dump del modulo di input e postarlo accanto al log per lo stesso input in modo da poter individuare la differenza. – WebweaverD

+0

Tutti i valori dell'array sono impostati come previsto o sono solo le informazioni GET/POST? Inoltre, sono solo curioso, perché stai usando print_r per restituire l'array $ _POST quando $ this-> input-> post() sta già restituendo i dati. Non sembra che tu stia pulendo i dati, ma tagliandoli. Sembra ridondante. –

risposta

10

Come citato da Patrick Savalle si dovrebbe usare ganci . Utilizzare l'hook post_controller_constructor in modo da poter utilizzare tutti gli altri elementi della configurazione.

1) In ./application/config/config.php impostato $config['enable_hooks'] = TRUE

2) In ./application/config/hooks.php aggiungere il seguente gancio

$hook['post_controller_constructor'] = array(
    'class' => 'Http_request_logger', 
    'function' => 'log_all', 
    'filename' => 'http_request_logger.php', 
    'filepath' => 'hooks', 
    'params' => array() 
); 

3) Creare il file ./application/hooks/http_request_logger.php e aggiungere il seguente codice come esempio.

if (!defined('BASEPATH')) 
    exit('No direct script access allowed'); 

class Http_request_logger { 

    public function log_all() { 
     $CI = & get_instance(); 
     log_message('info', 'GET --> ' . var_export($CI->input->get(null), true)); 
     log_message('info', 'POST --> ' . var_export($CI->input->post(null), true));     
     log_message('info', '$_SERVER -->' . var_export($_SERVER, true)); 
    } 

} 

L'ho provato e funziona per me (assicurati di aver attivato la registrazione nel tuo file di configurazione).

+0

è corretto dichiarare $ CI come pubblico in un file hook? –

+0

@ VipinKr.Singh Guardandolo di nuovo, non vedo alcun motivo per dichiararlo al di fuori della funzione. Ho modificato l'esempio. –

+0

Nulla sta scrivendo nella pagina delle informazioni, nessuna pagina viene creata dal tuo codice. :( –