Mam problem z dziedziczeniem. Zrobiłem klasę AbstractController która zawiera metodę getView(), która zwraca mi zmienną $view w której trzymam ścieżkę do pliku z widokiem.
abstract class AbstractController implements AbstractControllerInterface { private $view; public function getView() { return $this->view; } }
Stworzyłem klasy UserController oraz IndexController która dziedziczy po klasie AbstractController. W metodzie tych klas, indexAction() ustawiam ścieżkę do pliku i zapisuję ją w zmiennej $view:
class UserController extends AbstractController { private $service; public function __construct() { self::$indexRoute = BASE_PATH . '\module\User\view\index.phtml'; } public function indexAction() { $this->view = self::$indexRoute; } } class IndexController extends AbstractController { public function __construct() { self::$indexRoute = BASE_PATH . '\module\Application\view\index.phtml'; } public function indexAction() { return $this->view = self::$indexRoute; } }
Dalej stworzyłem klasę Strategy która wybiera, który controller utworzyć:
class Strategy { private function __construct() {} { switch ($id) { case "index": self::$strategy = new IndexController(); break; case "user": self::$strategy = new UserController(); break; } return self::$strategy; } }
następnie stworzyłem klasę View która odpowiada za wyświetlenie:
class View { private $output; private $layout; public function __construct($controller) { $this->layout = BASE_PATH . '\module\Application\view\layout\layout.phtml'; $this->output = $controller->getView(); require($this->layout); } public function getLayout() { return $this->layout; } public function getOutput() { require($this->output); } }
No i na końcu plik index.php który to wszystko łączy:
if ($array[1] == NULL) { $array[1] = 'index'; } try { $controller = Strategy::getStrategy($array[1]); $controller->indexAction(); $view = new View($controller); } catch(Exception $e) { }
Wszystko działa pięknie jeśli do klas UserController i IndexController dodam ręcznie metodę getView która znajduje się u ich rodzica AbstractController. Same niestety tej metody nie chcą dziedziczyć. Tzn dziedziczą lecz do klasy View dociera pusta zmienna $view zbłędem:
Warning: require(): Filename cannot be empty in C:\websites\mikrop\vendor\Framework\View\View.php on line 20
Fatal error: require(): Failed opening required '' (include_path='.;C:\php\pear') in C:\websites\mikrop\vendor\Framework\View\View.php on line 20
Tak jakby klasa UserController i IndexController odziedziczyły metodę getView() lecz nie wykonały jej wogóle(?) lub niewykonały jej porawnie? Jeśli bedę miał większą ilość Controllerów to wolałbym aby metoda która i tak zawsze będzie wyglądać tak samo, mogła być dziedziczona. Niestety gdzieś robię błąd. Proszę o pomoc.