2017-07-07 98 views
6

我目前正在从事一个需要从其父目录访问类的Laravel项目。作曲家自动加载 - 从父目录加载类

composer.json> PSR-4:

"psr-4": { 
     ... 
     "ModuleA\\": "../ModuleA/baseObjects", 
     "ModuleB\\": "../ModuleB/baseObjects" 
    } 

示例文件结构:

/var/www 
+- /xxx (project) 
    +- /ModuleA 
     +- /baseObjects 
      - configClass.inc 
    +- /ModuleB 
     +- /baseObjects 
      - configClass.inc 
    +- /laravel 
     - composer.json 

我跑composer dump-autoload,但该项目仍然无法找到ModuleA\configClass既不ModuleB\configClass

此外,我autoload_psr4.php内,上述被引用如下:

'MobuleA\\' => array($baseDir . '/../MobuleA/baseObjects') 
'MobuleB\\' => array($baseDir . '/../MobuleB/baseObjects') 

预先感谢您。

+0

试试 “”: “SRC(主文件夹我猜它)/” 没有必要只是初始化模块添加文件夹和/ – DaAmidza

回答

0

尝试:

"psr-4": { 
     ... 
     "ModuleA\\": "ModuleA/baseObjects", 
     "ModuleB\\": "ModuleB/baseObjects" 
} 
+0

它不起作用,上面的代码试图找到它在当前目录中,我试图访问父目录。 – dzerow

0

根据这一answer你可以在index.php文件添加:

$loader = require 'vendor/autoload.php'; 
$loader->add('Namespace\\Somewhere\\Else\\', __DIR__); 
$loader->add('Namespace\\Somewhere\\Else2\\', '/var/www/html/xxx'); 
4

PSR-4需要加载的文件有一个命名空间类,并且名称空间结构必须与目录结构相匹配(相对于配置中定义的“基本目录”(http://www.php-fig.org/psr/psr-4/))。

所以,在文件/var/xxx/ModuleA/baseObjects/configClass.inc应该是类

namespace ModuleA\baseObjects; 

class configClass { 
    ... 
} 

然后在var/www/laravel/composer.json你可以有

"psr-4": { 
     "App\\": "app/", 
     "ModuleA\\": "../ModuleA" 
    } 

这意味着:“目录../ModuleA应该是根ModuleA命名空间,然后按照子命名通过匹配从那里的子目录“。

1

您遇到的问题与父目录无关。实际上,您的Composer.json自动载入配置对于您的目录结构是正确的。

问题是.inc文件扩展名,它与PSR-4规范不兼容。这里更多的信息:How To Make Composer (PSR-4) To Work With ".class.php" Extension?

如果你不能更新你的源代码相匹配的PSR-4规格的,你可以使用Class Mapping

的类映射引用都结合起来,在安装/更新到一个单一key =>值数组可能在生成的文件vendor/composer/autoload_classmap.php中找到。该地图通过扫描给定目录/文件中的所有.php.inc文件中的类来构建。

您可以使用类映射生成支持为所有不遵循PSR-0/4的库定义自动加载。要配置它,可以指定所有目录或文件来搜索类。

那么你的配置可能类似于:

"autoload": { 
    "classmap": [ 
     "../ModuleA/baseObjects", 
     "../ModuleB/baseObjects" 
    ] 
} 

记住,如果你使用类映射,你需要运行composer dump-autoload你改变composer.json任何时候,添加一个类,修改类的名字/文件名/路径等

额外:通过@alepeino指出的那样,使用autoloader optimization将产生从任何PSR-0和PSR-4自动加载定义一类图,使用相同的底层代码classmap自动加载使用。这将“允许”您使用PSR-4自动加载器和.inc扩展。不过,每次更改文件时,这仍然需要您运行composer dump-autoload --optimize,就像classmap一样。

最佳推荐:更改您的源代码以遵循PSR-4规范,并使用.php扩展。

如果你不能这样做,那么下一个最好:使用classmap进行自动加载。

+0

我之所以这样想,是因为我尝试了它,发现虽然PSR-4规范声明文件扩展名“MUST”是“.php”,但作曲者实际上正确加载了“.inc”。 – alepeino

+0

我希望看到您使用的测试代码进行测试。我做了一个与所讨论的目录结构匹配的基本PSR-4设置,然后将其中一个类扩展名改为.inc,并且不能再找到它。 [自动加载器明确设置扩展名](https://github.com/composer/composer/blob/e42e1156d51ca5494b058b1a7b480bc703c4f57a/src/Composer/Autoload/ClassLoader.php#L351)。也许Composer版本有所不同? –

+0

事实证明,我在Laravel项目中完成了第一次测试,然后再次尝试了一个新的临时项目,并且无法正常工作。我的原始composer.json打开了'optimize-autoloader'。见https://github.com/alepeino/composer-optimize – alepeino

0

使用classmap autoload将解决此问题。

{ 
... 
"autoload": { 
     "classmap": ["ModuleA/", "ModuleB/"] 
    } 
} 

这可能与使用PSR-4

{ 
    ... 
    "autoload": { 
      "psr-4": { 
       "Acme\\": "src/Acme/" 
      }, 
      "classmap": ["ModuleA/", "ModuleB/"] 
     } 
    } 

编号:https://getcomposer.org/doc/04-schema.md#classmap