У меня есть приложение на основе MVC с основным правилом URL-переписывания, которое делает URL-адрес таким образом: website/controller/action/id
. id
не является обязательным.В PHP, когда автозагрузка файлов, где PHP будет искать эти файлы?
Если пользователь вводит недопустимый action
, он должен получить сообщение об ошибке, которое обрабатывается в классе ErrorController
.
Все файлы моих классов требуются в файле autoloader
, поэтому я не должен требовать их каждый раз, когда хочу создать объект. Я использую spl_autoload_register()
для автозагрузки.
Проблема возникает, когда я пытаюсь ввести URL-адрес с недопустимым action
. Например, для URL website/main/inde
(вместо index
) - должен быть создан экземпляр ErrorController
.
Вместо этого, я получаю это две ошибки PHP:
Warning: require(!core/errorcontroller.php): failed to open stream: No such file or directory in D:\Programs\Wamp\www\fanfics\v0.0.2!core\autoloader.php on line 5
И
Fatal error: require(): Failed opening required '!core/errorcontroller.php' (include_path='.;C:\php\pear') in D:\Programs\Wamp\www\fanfics\v0.0.2!core\autoloader.php on line 5
Вот визуальный мои файлы (восклицательный знак перед папки core
для поддержания его на вершине):
index.php:!
<?php
require "!core/autoloader.php";
$loader = new Loader();
ядро / autoloader.php
<?php
function autoload_core_classes($class)
{
require "!core/" . strtolower($class) . ".php";
}
function autoload_controllers($class)
{
require "controllers/" . str_replace("controller", "", strtolower($class)) . ".php";
}
function autoload_models($class)
{
require "models/" . str_replace("model", "", strtolower($class)) . ".php";
}
spl_autoload_register("autoload_core_classes");
spl_autoload_register("autoload_controllers");
spl_autoload_register("autoload_models");
ядро / basecontroller.php
<?php
abstract class BaseController
{
protected $model;
protected $view;
private $action;
public function __construct($action)
{
$this->action = $action;
$this->view = new View(get_class($this), $action);
}
public function executeAction()
{
if (method_exists($this->model, $this->action))
{
$this->view->output($this->model->{$this->action}());
}
else
{
// Here I create an ErrorController object when the action is invalid
$error = new ErrorController("badmodel");
$error->executeAction();
}
}
}
Если я пытаюсь требовать controllers/error.php
специально - он работает отлично:
.
.
.
else
{
require "controllers/error.php"; // With this line it works just fine
$error = new ErrorController("badmodel");
$error->executeAction();
}
После долгого поиска в Интернете, я понимаю, что есть проблема с include_path
, но я не совсем понимаю. Как я могу решить эту проблему?
Укажите автозагрузчик в каталог ваших классов, и он получит их. – Script47
Я попытался переместить его в корень (вместе с 'index.php'). Все те же ошибки. :( – Sipo
Зарегистрировать один автозагрузчик не 3. – Script47