Composer autoload无法正常工作

时间:2014-01-12 15:06:11

标签: php composer-php autoloader

我正在使用composer autoload构建我已构建的mvc框架。我已经对它进行了测试并在Vagrant环境(配置:http://pastebin.com/aAs2TFMh)上运行,甚至在Windows上运行。

我收到此错误:{"error":{"type":"Whoops\\Exception\\ErrorException","message":"Class 'Elysium\\Controllers\\Error' not found","file":"\/home\/glendme\/public_html\/clubsmade\/src\/elysium\/core\/Router.php","line":99}}

然而,当我使用Ubuntu 13.04 + php5.4在我的vps上部署它时,它开始给出类未找到的错误。当我把它放在共享主机上时也是如此。

我尝试了自我更新,无法再次删除供应商目录和作曲家安装。

这是我的composer.json,

{
"name": "glend/elysium",
"description": "PHP MVC Framework.",
"version" : "0.1.0-dev",
"keywords" : ["mvc", "framework", "elysium", "glend"],
"homepage" : "http://mvc.blueberry.al",
"license" : "GPL-3.0+",
"authors": [
    {
        "name": "Glend Gjermeni",
        "email": "contact@glend.me",
        "homepage": "http://glend.me",
        "role": "Developer"
    }
],
"support": {
    "email": "support@blueberry.al"
},
"autoload": {
    "psr-0": {"Elysium": "src/"}
},
"require": {
    "filp/whoops": "1.*",
    "swiftmailer/swiftmailer": "*",
    "vlucas/valitron": "1.1.5",
    "ircmaxell/password-compat": "1.0.3"
}

}

和Router.php:

    <?php

namespace Elysium\Core;
use Elysium\Controllers;

/**
 * Manages all routing and URL requests for the framework.
 * @package Elysium\Core
 */
class Router
{
    private $url, $controller, $method, $params;
    private $allowedChars = array('-', '_', '/', '\\', '.');

    /**
     * Reads the passed URL from GET request into controller, method and params variables.
     */
    public function __construct()
    {
        if(!empty($_GET['page']))
        {
            if(ctype_alnum(str_replace($this->allowedChars, '', $_GET['page'])))
            {
                $this->url = $_GET['page'];
            }
            else
            {
                throw new Exception("Malformed URL");
            }
        }
        else
        {
            $this->url = 'index';
        }

        $this->url = explode('/', $this->url);

        $this->controller = implode('_', array_map('ucfirst', explode('_', str_replace('-', '_', array_shift($this->url)))));
        $this->method = explode('_', str_replace('-', '_', array_shift($this->url)));

        for($i = 1; $i < count($this->method); $i++)
        {
            ucfirst($this->method[$i]);
        }

        $this->method = implode('_', $this->method);
        $this->params = &$this->url;
    }

    /**
     * Initializes correct controller based on URL requested.
     */
    public function commit()
    {
        $class = "Elysium\\Controllers\\$this->controller";

        if(class_exists($class))
        {
            if(method_exists($class, $this->method))
            {
                if(empty($this->params))
                {

                    $ctrl = new $class;
                    $ctrl->{$this->method}();
                }
                else
                {
                    $ctrl = new $class;
                    $ctrl->{$this->method}($this->params);
                }
            }
            else if(empty($this->method))
            {
                $ctrl = new $class;
                $ctrl->index();
            }
            else
            {
                self::error(404);
            }
        }
        else
        {
            self::error(404);
        }
    }

    /**
     * Initializes default Error controller based on error code provided and shows the appropriate error page.
     * @param $code
     */
    public static function error($code)
    {
        switch($code)
        {
            case 404:
            {
                $ctrl = new Controllers\Error();
                $ctrl->notFound();
                break;
            }
            default:
            {
                break;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:5)

我自己修正了,如果你坚持使用PSR-0,那么文件夹名称必须像命名空间一样具有大写字母。如果你不想改变,你可以使用作曲家的类图。