2013-01-04 10 views
5
class SomeController extends Controller 
{ 

     public function actionIndex() { 
       echo 'This is some controller'; 
     } 
} 


class AnotherController extends SomeController 
{ 

     public function actionIndex() { 
       echo 'This is another controller'; 
     } 
} 

to działa:Yii - dziedziczenie z klasy niestandardowej kontrolera - Not Found

index.php?r=some 

ale ...

index.php?r=another 

mówi:

ostrzeżenie PHP

include (SomeController.php): failed to open stream: Nie ma takiego pliku lub katalogu

Oba pliki są w

test\protected\controllers\ 

BTW w przeszłości próbował również przy użyciu Generatora Gii Kontroler z „SomeController” jako klasy bazowej ...

mówi:

The controller has been generated successfully. You may try it now. 

Generating code using template 
"C:\xampp\htdocs\yii\framework\gii\generators\controller\templates\default"... 
generated controllers\YetAnotherController.php 
generated views\yetAnother\index.php 
done! 

po kliknięciu na „spróbuj teraz” go również powiedział:

ostrzeżenie PHP

include (SomeController.php): failed to open stream: Nie ma takiego pliku lub katalogu

Odpowiedz

11

Edit:

Klasy wewnątrz chronione/kontrolery nie są ładowane automatycznie, dlatego przed rozpoczęciem pracy z nim należy zaimportować plik klasy nadrzędnej:

W AnotherController.php:

Yii::import('application.controllers.SomeController'); 
public class AnotherController extends SomeController { 
    // ... 
} 

Okrywać trzeba otworzyć klasę bazową z url również można użyć powyższej metody. W przeciwnym razie możesz umieścić swoją klasę bazową wewnątrz chronioną/komponentami, jak już wiesz.


Automatyczne ładowanie działa tylko wtedy, gdy nazwa pliku jest taka sama, jak klasa pliku. Znaczenie class SomeController powinno znajdować się w zakresie pliku SomeController.php.

Dokonaj tych zmian i powinno działać.

Pomocne wiki: Understanding Autoloading Helper Classes and Helper functions.

Guide link:

Pliki klas powinny być nazwane klasy publicznej, które zawierają.

+0

Tak, jest w \ protected \ controllers \ SomeController.php BTW jak powiedziałem "http: //localhost/yii/testapp/index.php? R = some" works ... Ale Gii's "YetAnotherController.php" (index .php? r = yetAnother) i mój "AnotherController.php" (index.php? r = another) daje błędy dotyczące ich klasy bazowej (SomeController.php). Wydaje się, że jest problem z automatycznym ładowaniem SomeController.php, gdy jest to klasa podstawowa, ale działa dobrze, jeśli używam index.php? R = some. Również otrzymuję ten sam błąd, gdy odwołuję się do Post.php w kontrolerze ... to jest w modelach/Post.php ... –

+0

oh ok, to czy będziesz uzyskiwać dostęp do kontrolera podstawowego z adresu URL? czy jest to tylko klasa bazowa i chcesz go używać tylko jako takiego? –

+0

Zastanawiałem się, czy mogę zrobić oba? –

3

Aby przedłużyć każda klasa po prostu pójść do pliku konfiguracyjnego i dodać klasę w dziale importu

'import' => array('application.controllers.SomeController')

uczyni to dostępny w całej aplikacji bez importowania wyraźnie.

+0

Dzięki za miłą wskazówkę! – wallerjake

Powiązane problemy