Laravel psr-0自动加载

时间:2014-01-23 22:36:15

标签: laravel-4 composer-php

我正在使用框中出现的标准laravel目录结构。我把它添加到composer.json

"autoload": {
    "classmap": [
        "app/commands",
          ....
    ],
      **"psr-0": {
        "CARS": "app/"
        }**
},

我有一个视图

<?php namespace Views;
class MyView {

    public function Build()
    {
        return "Great !";
    }
}
?>

和控制器

class MyController extends \BaseController {
    public function loadHome() {
       $view = new \Views\MyView;
       return $view->Build();
    }   
}

它说找不到类'Views \ XView'。

我已经使用PSR-0运行了一次composer自动加载,但现在我想添加Controllers和View而不重新运行作曲家,我相信PSR-0允许我这样做(如果我运行作曲家,它的作品顺便说一下。

3 个答案:

答案 0 :(得分:4)

在尝试使用时,你基本上没有使用PSR-0 ......

如果你告诉Composer你有:

"psr-0": {
    "CARS": "app/"
}

中的文件会非常拼命
app/CARS/*.php

并且还将理解其上的所有文件都在CARS命名空间下:

所以,你的班级必须在:

/whatever/application/app/CARS/Views/MyView.php

必须声明为

<?php namespace CARS\Views;

class MyView {

    public function Build()
    {
        return "Great !";
    }

}

答案 1 :(得分:1)

当我查看作曲家的版本1.8.6时,遇到的问题与我提到的Docs

在psr-0键下,定义相对于包根目录的从名称空间到路径的映射。请注意,这也支持PEAR样式的非命名间隔约定。

注意,名称空间声明应以\结尾,以确保自动加载器准确响应

{
   "autoload": {
       "psr-0": {
         "Monolog\\": "src/",
         "Vendor\\Namespace\\": "src/",
         "Vendor_Namespace_": "src/"
       }
    }
}

这就是我感兴趣的地方,PSR-0样式不仅限于名称空间声明,还可以在类级别下指定。这对于在全局名称空间中只有一个类的库很有用。例如,如果php源文件也位于包的根目录中,则可以这样声明:

{
    "autoload": {
        "psr-0": { "UniqueGlobalClass": "" }
    }
} 

注意 例如,您需要声明其完整路径

文件结构为

/myProject
   -/app
   --/Acme
   ---/Repositories
   ----/MyClass

所以我的作曲家psr-0看起来像

"psr-0": {
    "Acme": "app/Acme/"
 },

希望这对某人有帮助

答案 2 :(得分:0)

您需要将其包装到CARS命名空间配合