Mam oto dość prosty i typowy dla architektury MVC framework.
Problem jest w załadowaniu metody statycznej ładującej szablon (klasy dispatcher) -
_loadTemplate()Treść błędu:
"Fatal error: Call to undefined method base::_loadTemplate() in ..."Nie wiem, co jest tego powodem bo odwołanie do niej jest prawidłowe
(tj. base::_loadTemplate($controller, $template, $viewvars, $uselayout)
, i ogólnie kontroler zostaje poprawnie załadowany, tylko widok nie.
Podejrzewałem że mam namieszane w httpd.conf, z obsługą mod_rewrite lub z php.ini ale chyba wszystko tam gra ...
httpd.conf<Directory />
Options FollowSymLinks
AllowOverride All
Order deny,allow
Deny from all
Satisfy all
</Directory>
.htaccessRewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1
index.php<?php
/*
* index.php
* Jest to plik rozruchowy
*/
include ("core/ini.php");
initializer::initialize();
/* obiekt o nazwie loader - on ma wczytać obiekty
* za pomocą wzorca Singletone (żeby zmniejszyć obciążenie systemu
*/
$router = loader::load("router");
dispatcher::dispatch($router);
?>
core/main/router.php<?php
/**
*
* Zadaniem router'a jest odszukanie kontrolera, akcji i parametrów w żądaniu URL
*
*/
class router
{
private $route;
private $controller;
private $action;
private $params;
public function __construct()
{
{
require_once("app/config/routes.php");
}
$config = loader::load("config");
{
$default_controller = $config->default_controller; // w configs.php jest odwołanie
if(!empty($default_controller)) $path[0] = $default_controller;
else
$path[0] = "index";
}
$route = $path[0];
$sanitzing_pattern = $config->allowed_url_chars; // w configs.php jest odwołanie
$this->route = $route;
$routeParts = explode("/", $route); $this->controller = $routeParts[0];
$this->action = isset($routeParts[1
]) ?
$routeParts[1]: "base"; $this->params = $routeParts;
// Dopasowanie wzorca routingu zdefiniowanego przez użytkownika
{
foreach($routes as $_route)
{
$_pattern = "~{$_route[0]}~";
$_destination = $_route[1];
{
$newrouteparts = explode("/", $_destination); $this->controller = $newrouteparts[0];
$this->action = $newrouteparts[1];
}
}
}
}
public function getAction()
{
if(empty($this->action)) $this->action = "main"; return $this->action;
}
public function getController()
{
return $this->controller;
}
public function getParams()
{
return $this->params;
}
}
?>
core/main/dispatcher.php<?php
/**
* Klasa dispatcher
*
* Głównym zadaniem tej klasy jest pobranie obiektu router'a jako parametru
* a następnie odszukanie kontrolera, akcji i parametrów z router'a
* Jeżeli plik kontrolera będzie dostępny to zostanie wczytany i nastąpi
* inicjalizacja kotrolera. Po zakończeniu inicjalizacji zostanie wykonana akcja
*
*/
class dispatcher
{
public static function dispatch
($router) {
$config = loader::load("config");
// configs.php - odwołanie
if($config->global_profile) $start = microtime(true); // poniżej ważna część kodu
$controller = $router->getController();
$action = $router->getAction();
$params = $router->getParams();
{
if("unittest" == $params[count($params)-1
] || '1' == $_POST['unittest']) unittest::setUp();
}
$controllerfile = "app/controllers/{$controller}.php";
{
require_once($controllerfile);
$app = new $controller;
$app->use_layout = true;
$app->$action;
unittest::tearDown();
/**************************
* Zarządzanie widokiem *
**************************/
$view = loader::load("view");
$viewvars = $view->getVars($app);
$uselayout = $config->use_layout;
if(!$app->use_layout) $uselayout=false;
$template = $view->getTemplate($action);
base::_loadTemplate($controller, $template, $viewvars, $uselayout);
echo "<p>Całkowity czas rozdzielenia:" }
else
throw new Exception("Kontroller nie został znaleziony");
}
/**
* TEJ METODY STATYCZNEJ NIE MOŻE ZNALEŹĆ[/b]
*
*/
public static function _loadTemplate
($controller, $template, $vars, $uselayout=false) {
if($uselayout)
$templatefile = "app/views/{$controller}/{$template}.php";
{
include_once($templatefile);
}
else
{
throw new Exception("Widok '{$template}.php' nie został znaleziony w katalogu views/{$controller}.");
}
if($uselayout)
{
$layoutfilelocal = "app/views/{$controller}.php";
$layoutfileglobal = "app/views/layouts/{$controller}.php";
include_once($layoutfilelocal);
else
include_once($layoutfileglobal);
}
}
}
?>
Ten post edytował blackneron 22.11.2009, 04:29:14