Недавно я переместил свой WIP-сайт с компьютера с Windows XP с WAMP на MacBook с MAMP. Когда я тестирую сайт, я обнаруживаю, что перенаправления (то есть, $this->redirect="Index.php";
кажется, не работает. Они отлично работали на машине с Windows XP.
Я использую шаблон фронт-контроллера. Страница индекса выглядит так:
Index.php:
<?php
.....
switch ($action){
case 'logoff':
require_once('Controller_Logoff.php');
$command=new controller_Logoff();
break;
case 'register':
require_once('Controller_Register.php');
$command=new controller_Register();
break;
...
}
...
$command->execute($view);
$menu=array(
new MenuEntry("Logoff","Index.php",array("action"=>"logoff")),
new MenuEntry("Register","Index.php", array("action"=>"register")),
....
) // This menu is shown on the user's view
if ($command->getRedirect()){ //This case doesn't work
header('Location:'.$command->getRedirect());
}else if ($command->getInclusion()){ //This case works
include ("UI_Header.php");
include ("UI_Menu.php");
include ("UI_Message.php");
echo "<div class='content'>";
include ($command->getInclusion());
echo "</div>";
include ("UI_Footer.php");
}
Проблема, кажется, возникает на этом этапе: header('Location:'.$command->getRedirect());
Обратите внимание, что все равно не получится, если я сделаю header('Location: http://localhost:8888/'.$command->getRedirect());
,
Я также пытался включить ob_start();
в моем сценарии безрезультатно.
Пример на одной из страниц контроллера (в конце регистрации нового пользователя) у меня есть:
Controller_register.php:
<?php
class Controller_Register extends Controller {
protected $inclusion='UI_Register.php';
function execute($view){
.... // Code to register a new user - that works, i.e., a new user appears in the DB
var_dump("Before redirect");
$this->redirect="Index.php";
var_dump("after redirect");
}
redirect
переменная в классе, используемая для различных контроллеров. Это установлено как null
в родительском классе. Я проверил, что это изменено к его правильному значению (Index.php
) к тому времени, когда заголовок должен быть выполнен.
Когда я запускаю этот код, я получаю пустую страницу. Точный ход событий:
http://localhost:8888/Project/
register
который отправляет меня на страницу регистрации, который URL http://localhost:8888/Project/Index.php?action=register
submit
— информация успешно загружена в БД.http://localhost:8888/Project/Index.php?action=register
но очевидно файл (страница регистрации) не загружен.Журнал ошибок с момента, когда я начинаю нажимать на register
ссылка дает следующее:
output started at /Applications/MAMP/htdocs/Project/Index.php:1)
Удалите метку спецификации из Index.php или любое пространство перед <?php
http://en.wikipedia.org/wiki/Byte_order_mark
И прочитайте это, пожалуйста — https://stackoverflow.com/a/8028987/1164491
Я предполагаю, что код, которым вы поделились, показывает только те части, которые вы считаете релевантными; и основываясь на этом, что я хотел бы сделать, это добавить exit
после отправки header
так что вы уверены, что после:
...
if ($command->getRedirect()) { //This case doesn't work
header('Location:'.$command->getRedirect());
exit;
} else if ...
var_dump("Before redirect");
$this->redirect="Index.php";
var_dump("after redirect");
Это то, что вызывает сбой перенаправления. Дампы var выводятся в браузер, предотвращая перенаправление. Попробуйте закомментировать vardumps и посмотрите, работает ли он.
Я также попытался включить ob_start (); в моем сценарии безрезультатно.
Это тоже должно работать, но убедитесь, что это включено до запуска приведенного выше кода.