【问题标题】:Laravel psr-0 auto-loadingLaravel psr-0 自动加载
【发布时间】:2014-02-14 17:52:40
【问题描述】:

我使用的是开箱即​​用的标准 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();
    }   
}

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

我已经使用 PSR-0 运行过 composer auto-load 一次,但现在我想在不重新运行 composer 的情况下添加控制器和视图,我相信 PSR-0 允许我这样做(如果我运行作曲家,顺便说一句)。

【问题讨论】:

    标签: laravel-4 composer-php


    【解决方案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】:

      您基本上没有使用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 !";
          }
      
      }
      

      【讨论】:

        【解决方案3】:

        您需要将其包装到 CARS 命名空间伴侣中

        【讨论】:

        • 我确实尝试将 MyView.php 中的命名空间更改为 CARS\Views 但没有乐趣 - 找不到相同的类错误。但是,如果我完全删除命名空间并使用新的 \MyView 从控制器中引用它,它就可以正常工作。
        • 查看 Antonios 示例。
        猜你喜欢
        • 2015-01-08
        • 2014-03-24
        • 2014-07-25
        • 2013-11-09
        • 2014-08-02
        • 2014-10-19
        • 2019-12-22
        • 2014-09-11
        • 2014-04-16
        相关资源
        最近更新 更多