2011-01-05 12 views
9

Ściśle przestrzegałem how-to article by Phil Sturgeon, aby rozszerzyć kontroler podstawowy. Ale wciąż mam błędy.Kodek rozszerzający rozszerzony MY_Controller

Kim 3 klasy:

// application/libraries/MY_Controller.php 
class MY_Controller extends Controller{ 
    public function __construct(){ 
     parent::__construct(); 
    } 
} 

// application/libraries/Public_Controller.php 
class Public_Controller extends MY_Controller{ 
    public function __construct(){ 
     parent::__construct(); 

    }  
} 

// application/controllers/user.php 
class User extends Public_Controller{ 
    public function __construct(){ 
     parent::__construct(); 
    } 
} 

Fatal error: Class 'Public_Controller' not found in /srv/www/xxx/application/controllers/user.php on line 2

Ciekawym jest to, że po fragment działa, jeżeli przebiega bezpośrednio od MY_Controller:

// application/controllers/user.php 
class User extends MY_Controller{ 
    public function __construct(){ 
     parent::__construct(); 
    } 
} 

I załadowano sterowników za pośrednictwem __autoload() lub ręcznie . Kontrolery są ładowane pomyślnie.

CI-Version: 1.7.3

+0

Czy ładujesz MY_Controller.php przed załadowaniem Public_Controller.php? – Alisson

+0

Czy mógłbyś opublikować funkcję __autoload w config.php? –

+0

Istnieje wiele lepszych odpowiedzi na to pytanie: http://stackoverflow.com/questions/21663045/creating-a-core-class- that-extends-another-core-class-codeigniter/22125436#22125436, nawet jeśli jest zaznaczony jako duplikat tego – Chococroc

Odpowiedz

5

Trzeba wymagać Controller publiczny w MY_Controller

// application/libraries/MY_Controller.php 
class MY_Controller extends Controller{ 
    public function __construct(){ 
     parent::__construct(); 
    } 
} 

require(APPPATH.'libraries/Public_Controller.php'); 

Otrzymasz błąd ponieważ Public_Controller nigdy nie został załadowany. Dzięki temu możesz przedłużyć od Public_Controller

Podoba mi się to, co robisz, ponieważ robię to cały czas.

Można to zrobić również w MY_Controller kiedy musiał stworzyć Admin_Controller

// application/libraries/MY_Controller.php 
class MY_Controller extends Controller{ 
    public function __construct(){ 
     parent::__construct(); 
    } 
} 

require(APPPATH.'libraries/Public_Controller.php'); // contains some logic applicable only to `public` controllers 
require(APPPATH.'libraries/Admin_Controller.php'); // contains some logic applicable only to `admin` controllers 
+2

Nie powinno się tak dziać, jeśli __autoload działa. –

+0

@Phil, on tęsknił za tą częścią w twoim poście :) –

+0

Oh. "Załadowałem kontrolery przez __autoload() lub ręcznie." Kto wie :) –

5

należy umieścić Public_controller się z MY_Controller wewnątrz MY_Controller.php

// application/libraries/MY_Controller.php 
class MY_Controller extends Controller{ 
    public function __construct(){ 
     parent::__construct(); 
    } 
} 

class Public_Controller extends MY_Controller{ 
    public function __construct(){ 
     parent::__construct(); 

    }  
} 

używam __construct wszędzie i działa prawidłowo Niedawno napisałem aż an article jak to zrobić to w związku z zawijaniem logiki auth do rozszerzonych kontrolerów. Jest mniej więcej w połowie rozpoczynania dyskusji nad konstruowaniem kontrolerów.

1

Miałem taki problem, Po pewnym wyszukiwaniu sam znalazłem błąd, ponieważ moją nazwą klasy kontrolera był MY_Controller, ale nazwa pliku to My_Controller [Case not matching]. Uwaga: - W localhost nie wystąpił błąd.

W rozszerzonego kontrolera Używam

class Home extends MY_Controller{ 
    function __construct() { 
    parent::__construct(); 
    } 
} 

nawet mam błąd.

Po zmianie nazwy pliku na MY_Controller zaczęło działać poprawnie.

0

Mam niestandardową klasę kontrolera o nazwie MY_Controller to rozszerza CI_Controller i działa dobrze. Znajduje się on w aplikacji/core i ma niestandardowe funkcje lo load views w mojej witrynie.

używam klasy abstrakcyjnej My_app_controller który rozciąga MY_Controller dla my_app konkretnego behabior, chcę każdy kontroler w my_app rozszerzenie tej klasy abstrakcyjnej.(Używam Diferent aplikacje w miejscu, więc niektóre aplikacje przedłuży My_app_controller i inne aplikacje przedłuży My_other_apps_controllers)

Ale gdy próbuję przedłużyć My_app_controller z dowolnego kontrolera w mojej aplikacji „Main_app_controller extends My_app_controller” generuje klasa " My_app_controller 'nie znaleziono wyjątku.

znalazłem dwa rozwiązania:

  1. użytku include_once w pliku Main_app_controller.php.
    include_once APPPATH.'controllers/path/to/My_app_controler.php';

  2. złamać „jedna klasa w jednym pliku” reguły codeigniter i definiować moje My_app_controller właśnie w tym samym pliku MY_Controller jest (pod application/rdzenia).

Instrukcja mówi:

Use separate files for each class, unless the classes are closely related

Cóż ... są.

W każdym razie wolałem używać rozwiązania include_once, ponieważ uważam, że lepiej jest mieć jeden plik na klasę, a My_app_controller znajduje się w folderze application/controllers/my_app. (więc aplikacja/kontrolery/inne_apps będą istnieć)

Powiązane problemy