2012-12-07 15 views
5

Podsumowanie:CodeIgniter (pre-Controller) haczyki i buforowanie

Czy haki pre-regulator wykonać podczas buforowania? Czy istnieje jakiś punkt zaczepienia, który zostanie wykonany? (pre-system?)

Prawdopodobnie powinienem podkreślić fakt, że hak nie ma wpływu na zawartość wysyłaną do przeglądarki. To nie jest problem.


szczegółowa wersja:

Planuję realizację niektórych funkcji statystyki typu w projekcie mam zbudowany przy użyciu PHP i CodeIgniter.

Omawiany projekt jest niestandardowym systemem CMS - ze względu na wydłużone okresy między aktualizacjami Użyłem buforowania, aby przyspieszyć ładowanie; nie jest to konieczne, ale jest preferencyjne. Wydaje się, że jest to dobre rozwiązanie dla strony w dużej mierze statycznej; szczególnie tam, gdzie treść dynamiczna jest obsługiwana przede wszystkim po stronie klienta - np. żądania AJAX.

Proponowana funkcjonalność polega głównie hak pre-kontrolera który uzyskuje dostęp do metody, za pomocą bibliotek takich jak biblioteki User Agent, zanim je dumping do bazy danych. Stąd może być odpytywany, wysyłany przez JSON i manipulowany przed wyświetleniem przez coś takiego jak wtyczka jQuery flot.

Przeczytałem w dokumentacji na temat Web Page Caching, a także documentation regarding hooks. Niestety, wciąż nie jest jasne, czy użycie buforowania całkowicie obejmie haki.

Jestem świadomy cache_override jednak oznacza to wdrożenie własnego mechanizmu buforowania; nie to, co chcę zrobić!

Alternatywą byłoby zbieranie danych statystycznych klienta i przesyłanie go do serwera za pośrednictwem AJAX; ale to też nie jest idealne, ponieważ staram się mieć wyraźny rozdział logiki - z powodów konserwacji i testowania.

+0

Jeśli nie dostaniesz odpowiedzi w ciągu weekendu, napiszę kilka przypadków testowych i zagłębię się w kod źródłowy CI i zgłoś go ponownie –

Odpowiedz

10

W skrócie:

  • Czy haki pre-regulator wykonać podczas buforowania? nr.
  • Czy istnieje punkt zaczepienia, który zostanie wykonany? Takpre_system wykonuje.

Jeśli kopnięcia buforowania na system/core/CodeIgniter.php:189, jedyny haczyk, który dostaje szansę, aby uruchomić to pre_system (system/core/CodeIgniter:124).

Niestety, nie można uzyskać dużej funkcjonalności codeignitera w tym punkcie, nie get_instance() i bez tego większość bibliotek rdzenia nie jest również ładowana. Jeśli jesteś skłonny, możesz sprawdzić, jakie funkcje są zdefiniowane wewnątrz system/core/Common.php to wszystko, co masz.

Jeśli naprawdę chcesz, aby tę pracę za pomocą wbudowanego w klasach można rodzaju walczyć na swój sposób do obiektu bazy danych i drugi rdzeń rzeczy jak ta:

  1. Będziesz musiał ręcznie uzyskać BASEPATH.'database/DB.php' plik zawarty w. Na szczęście w klasie programu ładującego załadowano go pod numer require_once, więc nie spowoduje to przerwania strony w pamięci podręcznej.
  2. Gdy biblioteka Database załadowała instancję zwykłego obiektu $this->db, wywołując DB(). Bez parametrów załaduje domyślną bazę danych z plików konfiguracyjnych jak zwykle.
  3. W tym miejscu możesz wpisać swoje zapytania z haka pre_system, a ponieważ haki mogą być obiektami, możesz przenieść każdy kod logowania wewnątrz obiektu haka. Jeśli potrzebujesz innych bibliotek, możesz uzyskać ich instancję za pomocą funkcji load_class() (nie zapomnij ustawić trzeciego parametru z prefiksem na pusty ciąg znaków, jeśli nie ładujesz wbudowanej klasy).

Na koniec należy skończyć jak ten (kod wyimaginowanej):

class MyLoggingHook { 
    // called from the hook config 
    public function run($params = array()) { 
     require_once(BASEPATH.'database/DB.php'); 
     $db = DB(); // getting hold of a DAO instance 

     // routing information is always useful to have for pageview logs 
     $RTR = load_class('Router', 'core'); 
     $RTR->_set_routing(); 
     // Router also load Uri and Config classes inside so the following two instances could be interesting too: 
     // $RTR->uri 
     // $RTR->config 

     // load some useful library not related to CodeIgniter 
     $user_agent_detector = load_class('UserAgentDetector', 'libraries', ''); 

     // do some logging 
     $db->insert('page_view_log', array('class' => $RTR->fetch_class(), 'method' => $RTR->fetch_method(), /*...*/); 
    } 
} 

powinienem chyba wspomnieć, że nigdy nie używałem czegoś takiego w produkcji i istnieje ryzyko umieszczenia na funkcjonalnością który może się zmienić z wersji na wersję. Jeśli możesz zrobić bez dotykania klas Codeigniter w swoim haczyku, idź z tym.

Używanie PDO do uzyskiwania dostępu do bazy danych, ładowanie konfiguracji bazy danych za pomocą get_config(), można przejść bez dotykania jakichkolwiek powiązanych klas kodów.

+1

To jest idealna odpowiedź, dziękuję! Obawiałem się, że będę musiał go przechwycić na tak niskim poziomie, dzięki za potwierdzenie tego! Prawdopodobnie zastosuję się do twoich rad i uniknę użycia jakichkolwiek klas CI dla dobrej miary. Poza tym dałeś mi dobry punkt wyjścia do wkopania się w źródło - coś, za co jestem także wdzięczny! –