2014-09-02 1 views
-2

Я новичок в PHP. Я использую проект MVC в качестве примера, и я заметил, что каждый раз, когда нажата кнопка отправки, вызывается мой контроллер. Проблема в том, что при каждом нажатии кнопки создается новая модель.PHP MVC Controller создан снова и снова

Чтобы исправить это, я использовал скрытое поле, чтобы проверить, была ли нажата кнопка. Если это так, то я не создаю новую модель, иначе я это сделаю. Код от контроллера ниже:

//code listed below is in the controller which is called each time button 
//has been pressed... 
$myModel;//used to access model and its functions from controller 
if(isset($_POST['has_started'])) 
{ 
    //stores some logic that uses $myModel variable 
    playingGame(); 
} 
else 
{ 
    echo "just starting..."; 
    $myModel=new HangManModel(); 
    startGame($myModel); 
} 

Это похоже на работу, но потом, когда playingGame() называется он говорит мне, что я не могу использовать $ MyModel и его функции, потому что она не была объявлена, или не является объектом , Как я могу это исправить? Спасибо за помощь!

+0

Что такое «проект MVC», так как у вас код имеет ** НИЧЕГО **, чтобы сделать с архитектурным шаблоном MVC?! –

+0

Я думаю, что здесь у вас неправильная идея. PHP предназначен для использования через HTTP, а HTTP - без гражданства. Это означает, что вам придется создавать экземпляр вашего контроллера по каждому запросу. Следует также отметить, что «MVC» в php на самом деле не MVC (по крайней мере, что вы найдете в чем-то вроде C) – Scopey

+0

Как это не имеет ничего общего с MVC? Код выше находится в моем классе контроллера. Я пытаюсь выяснить, как предотвратить создание модели при каждом нажатии «submit». – JKoko

ответ

1

Во-первых, нет шаблона mvc, который я вижу здесь. Во-вторых, php выполняет и генерирует вывод в html и javascript и отправляется в браузер. При следующей обратной передаче php не сохраняет состояние для этого.

Как я понимаю, для хранения состояний вы можете использовать одно из следующих.

1) Вариант1 -> Использование сеанса.

//code listed below is in the controller which is called each time button 
//has been pressed... 
$myModel;//used to access model and its functions from controller 

    if(!isset($_SESSION)){session_start();} 
if(isset($_POST['someuniqueID'])) 
{ 
    //stores some logic that uses $myModel variable 
    $someuniqueID = $_POST['someuniqueID']; 
    $myModel = $_SESSION[$someuniqueID]; //retrieving the session object. 
    playingGame($myModel); //passing your model to the main function. 
} 
else 
{ 


    echo "just starting..."; 
    $myModel=new HangManModel(); 
//start session 

    $_SESSION['someuniqueID'] = $myModel; // do not store very complex model object to avoid server memory problem. 
    startGame($myModel); 
} 

2) Option2 -> вы можете сериализацию этого объекта и отправить его в скрытом поле, то она будет размещена назад, но это будет иметь пропускную способность проблемы потребления. Каждый раз, когда страница отправляется, она отправляет вашу модель назад и вперед.

3) Option3 -> Если ваша модель большая, используйте базу данных и создайте временную таблицу, в которой вы можете хранить уникальный идентификатор и сериализованный объект $ myModel. Вам нужно будет очистить нежелательные состояния от базы данных. потому что в отличие от сеанса и скрытого поля это постоянное хранилище.

+0

Большое спасибо! Я использовал шаблон дизайна MVC много раз, но никогда в PHP. Я попробую это, я ценю отзывы. – JKoko

+0

Добро пожаловать. надеюсь, что это поможет в качестве решения. – Ganesh