Ответов: 8 Просмотров: 1170
|
А зачем мне метод start() на этапе компиляции? Profile - это такой себе контроллер, который вызывает метод render из родителя Application и с помощью этого метода рендерит страничку(сам метод и класс Render я еще не написал, но суть пока не в этом).
Для понимания всей архитектуры приведу её полный пример здесь.
Она простая как газета Правда
Index.php
PHP:
скопировать код в буфер обмена
<? /* Подключаем нужные либы для старта и запускаем Aplication через метод start(). Я первый раз подобное пишу, возможно лучше было бы и конструктор просто сделать. */ require_once (__DIR__ . '/base/Application.php'); require_once (__DIR__ . '/base/Router.php'); $app = new Application(); $app->start();
Далее Application.php вычисляет куда мы обратились и передаёт строку в Router.
Хрен его знает как правильно, но написал как смог) Думаю потом у меня будет лучше получаться.
Router.php
PHP:
скопировать код в буфер обмена
class Router { public $routing = [ "class" => '', "function" => '', ]; public function __construct($uri) { $uri_elements = count($uri); for ($i = $uri_elements; $i != 0; $i--) { } } $this->mapper($uri); $this->registerClass(); } protected function mapper($uri) { $uri_count = count($uri); if ($uri_count == 1) { $this->routing = [ ]; } elseif ($uri_count == 2) { $this->routing = [ "function" => $uri[1], ]; } return true; } public function registerClass() { } public function autoload() { $path = realpath(dirname(__FILE__).'/../') . '/controllers/' . $this->routing['class'] . '.php'; if (require_once $path) { return true; } else { return false; } } }
Роутер же возвращает controller и action к которым следует далее обратиться.
И вот к примеру обращаясь к engine.com/profile/index мы получим controller "profile" и action "index". В котроллере происходят определенные действия и в итоге надо сделать рендер всего этого дела.
Profile.php
PHP:
скопировать код в буфер обмена
class Profile extends Application { public function index() { $model = "first"; $form = "second"; $this->render('index', [ "param1" => $model, "param2" => $form, ]); } public function settings() { $model = "first"; $form = "second"; $this->render('settings', [ "param1" => $model, "param2" => $form, ]); } }
Т.е. зная что контроллер у нас profile, то и вьюху будем искать в папке views/profile. Достаточно распространённый подход, как например в фреймворке Yii.
Так вот, я не могу понять, почему в Application.php если я использую свойство $view_folder не статически, то видимость его ограничена методом start()? Т.е. если оно не статическое, то я не могу написать в контроллере Profle $this->view_folder и получить результат. И в методе render(), который описан в классе Application(а вызывается из контроллера) я тоже не могу получить значение - $this->view_folder выдаёт NULL.
Структура папок в приложении имеет такой вид:
Пишу весь этот велосипед исключительно для себя и чтобы понять как работает та или иная фича.
Спасибо за помощь) |