Инициализация просмотра, шаблона и контроллера и модели является необязательной
Я был слишком сонлив, когда задал вопрос, так извините за это, так или иначе, чтобы понять, что я подготовил вопрос в течение 2 часов.
Я пытаюсь организовать свой код и решил организовать его mvc'ish (mvc-like), я не знаю, могу ли я следовать всем принципам, но я хотел быть как минимум близок к этому.
В моем приложении есть фронт-контроллер (не знаю, если мое определение правильное), так что весь http-запрос моего приложения будет проходить через одну точку, в моем случае index.php
в корневом каталоге моего приложение.
Сказав, что я настроил это так, вы можете себе представить, что я использовал .htaccess
для направления всего запроса на index.php
.
Я взорвал url
и создал массив из него, $url[]
, как это. Поэтому всякий раз, когда я получаю доступ к моему приложению, как этот http://localhost/app/pagename
, он будет обращаться к контроллеру (pagename_controller
)
Я сделал это вот так:
$file = $controller_path . $page . '_controller.php';
if (file_exists($file)) {
require $file;
$class_name = ucfirst($page) . '_controller';
$target = new $class_name();
}
Также я завершаю его в контейнере, "узор декоратора", для будущего использования, возможно, проверки.
например:
$controller = new Wrap($target);
$controller->index();
Я не знаю, подходит ли использование имени переменной $controller
, поэтому, пожалуйста, простите меня, когда все будет неправильно.
Мне кажется, что я могу настроить свое приложение следующим образом:
-
пользователь отправляет запрос, как? с помощью приложения означает, что он отправляет http-запрос, который загрузит начальное состояние приложения
![credit : phparchitect design patterns]()
Как вы можете видеть на диаграмме моей желаемой структуры приложения, я смог выполнить только первую часть, которая должна направить запрос на одну запись (index.php
)
Теперь проблема заключается в инициализации других частей приложения.
С этого момента у меня есть 3 файла, которые я хочу настроить, но я смущен тем, как.
index_controller
, index_view
, Template
class Index_controller {
private $model;
private $view;
public function __construct(){
// optional model -> $this->model = 'index'
$this->view = 'index' //
}
public function index(){
$this->load->view($this->view)
}
}
class Index_view {
private $model;
private $template;
public function __construct(Model $model = null){
$this->template = new Template('default');
}
public function view() {
$this->template->assign('css', 'default_css'); // don't know if this is efficient
// or $this->template->assign('header', 'default_header');
// or $this->template->assign('sidebar', 'default_sidebar');
// or $this->template->assign('footer', 'default_footer');
// or any other things I want to use in the template
}
}
class Template {
public $data = array();
private $tmpl;
public function __construct($template) {
$this->tmpl = $template . '_tmpl.php';
}
public function assign($name, $value){
$this->data[$name] = $value;
}
// public function output
// function that will explode the data array and render it out as a webpage
// I'll create templates and
}
С этой стороны я хочу знать, как мне связать эти вещи вместе. На данный момент у меня есть папка system
, которая может содержать классы, и я настраиваю автозагрузчик для этой папки.
Я думаю о создании класса Controller
и View
, который действует как ActionFactory и ViewFactory, как показано на диаграмме, хотя я знаю, что это не их обязанности.
Я думаю об этом:
class Controller {
protected $load;
public function __construct() {
$this->load = new View();
}
}
class View {
public function __construct() {
// some things i don't know
}
public function view() {
// some things i don't know
}
}
Каковы ваши предложения и комментарии в моей настройке. Как я могу инициировать триаду?
Ответы
Ответ 1
Хорошо, не слишком сильно зацикливайтесь на деталях реализации. Вы можете прочитать об обеспечении безопасности в какой-то другой момент. Поговорите с вашим вопросом...
Я действительно создал фреймворк, который работает по строкам, которые вы пытаетесь реализовать. Я думаю, что вам не хватает класса RoutingHandler. Маршрутизация - это физическая манипуляция URL-адресом, которая сообщает вашему приложению, какой контроллер загрузить, и какое действие выполнить.
В моем мире у меня также есть модули, поэтому основная схема маршрутизации
Module -> Controller -> Action
Эти три элемента отображают мою схему URI таким образом. Переменные могут быть добавлены так же...
http://www.domain.com/module/controller/action/var1/val1/var2/val2
Итак, что происходит после анализа URI, и управление передается соответствующему контроллеру и действию? Позвольте сделать некоторый код, чтобы продемонстрировать простой пример...
<?php
class indexController extends Controller {
protected function Initialize() {
$this->objHomeModel = new HomeModel;
$this->objHeader = new Header();
$this->objFooter = new Footer();
$this->objHeader
->SetPageId('home');
}
public function indexAction() {
$this->objHeader->SetPageTitle('This is my page title.');
}
}
?>
В методе Initialize
я устанавливаю некоторые элементы всего контроллера и захватываю экземпляр моей модели для использования позже. Реальное мясо находится в методе indexAction
. Здесь вы можете настроить материал, который будет использоваться в вашем представлении. Например...
public function randomAction() {
$this->_CONTROL->Append($intSomeVar, 42);
}
_CONTROL
- это массив значений, которые я манипулирую и передаю в представление. Класс Controller
знает, как найти правильный шаблон для представления, потому что он назван в честь действия (и в каталоге sibling).
Родительский класс Controller
берет имя метода действия и анализирует его так...
indexAction -> index.tpl.php
Здесь вы также можете сделать некоторые другие забавные вещи...
Application::SetNoRender();
... скажет контроллеру не отображать внутри шаблона, а просто завершить метод. Это полезно для тех ситуаций, когда вы действительно ничего не хотите выводить.
Наконец, все контроллеры, модели и представления живут внутри их собственного каталога, например...
my_module
controllers
indexController.class.php
someotherController.class.php
:
:
models
HomeModel.class.php
:
:
templates
index.tpl.php
someother.tpl.php
:
:
Я мог бы продолжать, но я пишу это по памяти, и есть некоторые морщины здесь и там, но, надеюсь, это дает вам пищу для размышлений.