PHP MVC ООП - как принять и обработать форму, отправленную аяксом.

albatros88

Новичок
Здравствуйте, прошу помощи по следующей проблеме...
В целях изучения ООП и паттерна проектирования MVC решил создать сайт с использованием этих технологий. Информации в интеренете полно, но....никак не могу разобраться в некоторый нюансах. Принципы MVC кажется понял....Контроллер реагирует на действия пользователя, принимает некие данные, компонует их и передает в модель, а модель в свою очередь их обрабатывает(сохраняет в базе, достает оттуда и прочее), а результат должен отразится в шаблоне, в котором чистый html с минимальным количеством логики. Стремиться нужно к тонкому контроллеру и толстой модели.

Есть следующая структура:
[/URL][/IMG]
[/URL][/IMG]

Есть файл controller/main.php - в нем описан класс контроллера main. Модель в model/main.php - описан класс модели. И соотвtтственно шаблон - view/main.tpl.
Есть одна точка вхождения index.php и все запросы адресуются именно на него. Там же и создается екземпляр класса и вызывается его метод, который собирает страничку по частям.

В шаблоне есть форма, я отправляю ее аяксом используя jQuery. В нетворке видно, что запрос идет. Как мне принять и обработать эту форму?

На форумах пишут, что это нужно делать в контроллере....НО КАК?? Ведь в контроллере у меня описан класс(!!!), допустим я могу написать метод в этом классе, который и будет обрабатывать данные....но ГДЕ мне вызывать этот метод, в каком месте, в каком файле?? Ведь в файле-контроллере должен быть только класс, верно?? Как это сделать так, чтоб это было правильно и вписывалось в концепции MVC и ООП ??

И еще, когда я оправляю форму на index.php, то в ответ приходит вся html страница, почему так?? Я создал отдельный файл controller/ajax_form.php и начал отправлять форму на него, а сам этот файл подключил инклюдом в index.php после создания екземпляра класса и все стало нормально, но я сомневаюсь, что это правильно с точки зрения MVC. или я ошибаюсь?

Так же заметил такую штуку...
В controller/ajax_form.php пишу следующее:
PHP:
if (isset($_POST['name'])) {
    echo $_POST['name'];   
}
А в блоке success:
PHP:
alert(response);
И в алерте выводится имя, введенное в форме, т.е. все ок.
Но при этом в controller/ajax_form.php:
PHP:
var_dump($_POST); // выводит NULL.
Как такое может быть. Помогите разобраться, кто чем может)) спасибо.
 

albatros88

Новичок
А где у тебя роутер?
роутер??

ну в index.php есть следующие строки:
PHP:
function __autoload($file) {
if (file_exists('controller/'.$file.'.php'))
    require_once 'controller/'.$file.'.php';
elseif (file_exists('model/'.$file.'.php'))
    require_once 'model/'.$file.'.php';
}

if (isset($_GET['action'])) {
    $class = trim(strip_tags($_GET['action']));
} else {
    $class = 'main';
}

if (class_exists($class)) {
    $obj = new $class;
    $obj->getTemplate($class);
} else {
exit('<p>Отсутствует класс!</p>');
}
Наверное это и есть роутер...или я чего-то не понимаю...как ПРАВИЛЬНО сделать?? Не могу найти "эталонную структуру", где, что подключать и т.д.
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
Будем считать, что это роутер. :)

Вот это и ответ на твой вопрос. Роутер определяет контроллер-экшен для твоего аякс-запроса (ровно как и не аякс). Вызывается $controllerClass->$actionMethod(), он возвращает response, дальше этот респонс отправляется в браузер.

А вообще, вместо того, чтобы собирать все шишки на собственном опыте, советую сначала ознакомиться с тем, к чему пришли люди, набивавшие эти шишки десятилетиями.

http://fabien.potencier.org/article/50/create-your-own-framework-on-top-of-the-symfony2-components-part-1 и далее все части.
 

AnrDaemon

Продвинутый новичок
Код:
if (file_exists
Но это же дико долго…
Если тебе пофигу, загрузится файл или нет, делай @include.
 

AnrDaemon

Продвинутый новичок
роутер??

PHP:
if (isset($_GET['action'])) {$class = trim(strip_tags($_GET['action']));
} else {$class = 'main';
}

if (class_exists($class)) {//$class = $class.'()';$obj = new $class;$obj->getTemplate($class);
} else {
exit('<p>Отсутствует класс!</p>');
}
Наверное это и есть роутер...или я чего-то не понимаю...как ПРАВИЛЬНО сделать?? Не могу найти "эталонную структуру", где, что подключать и т.д.
Роутер примитивный, но пока приложение маленькое - сойдёт.
В перспективе почитай PSR-4 и работай от запроса, а не от уже загруженных классов.

P.S.
Код:
GET /?action=Exception HTTP/1.0
 

fixxxer

К.О.
Партнер клуба
Роутер примитивный, но пока приложение маленькое - сойдёт.
В перспективе почитай PSR-4 и работай от запроса, а не от уже загруженных классов.

P.S.
Код:
GET /?action=Exception HTTP/1.0
Добавить неймспейс, и сойдёт для сельской местности.
 

AmdY

Пью пиво
Команда форума
Код:
if (file_exists
Но это же дико долго…
Если тебе пофигу, загрузится файл или нет, делай @include.
@include задачит все ошибки в подключаемом файле. лучше без собаки. да и как это не важно, я всегда использую require
 

fixxxer

К.О.
Партнер клуба
Собаку, конечно, не надо. Если хочется обработать - include_once и try-catch (в приличнах домах все завернуто в ErrorException в любом случае).

А вообще для этого композер есть.
 

AnrDaemon

Продвинутый новичок

fixxxer

К.О.
Партнер клуба
Да, конечно!

PHP:
$ cat inc.php
<?php

class Foo {

    function stupid typo() {
    }

}

$ php -d display_errors=1 -r 'include "inc.php";'

Parse error: syntax error, unexpected 'typo' (T_STRING), expecting '(' in /Users/fixxxer/tmp/inc.php on line 5

$ php -d display_errors=1 -r '@include "inc.php";'

$
 

hell0w0rd

Продвинутый новичок
@fixxxer не надо передёргивать… Мы говорим о рабочем коде.
оО, а ты как поймешь о том, что код рабочий?
Вот в ноде, на пример, при использовании bluebird теряется контекст ошибки, это такой п**ц, что хочется обратно на php вернуться.
 

albatros88

Новичок
Всем спасибо огромное, ваши советы помогли разобраться. Роутер сделал, вызывать нужный метод при запросе научился...

Остается непонятным вопрос, касательно ajax...Данные я получаю, и все кажется хорошо, НО...не дает покоя, то, что в ответ на запрос возвращается весь хтмл код страницы. Т.е. перед тем как селать в PHP
PHP:
echo 'ответ';
генерится страница и возвращается ее код вместе с 'ответ'. Так происходит, только если заворачивать все запросы на index.php. Если же обработку выносить в отдельный файл, то все ОК. Как это победить?
 
Последнее редактирование:
Сверху