首页 > 解决方案 > 我们可以在 psr-4 composer 命名空间路径之后手动添加子目录吗?

问题描述

我有不同版本的文件,它们存储在主文件夹内的单独子文件夹中。我打算根据动态确定的值使用子文件夹$ver
我可以为主文件夹创建一个 psr-4 作曲家命名空间,然后$ver根据需要添加子文件夹。
我尝试了以下,但它显示错误。

文件结构:

web\  
  public\index.php 
  main\
        V1\app.php
        V2\app.php
        V3\app.php

作曲家:

    "autoload": {
        "psr-4": {
            "Application\\": "main"
        }
    }

索引.php:

use Application;

$ver = "V2"; // suppose its V2 for now

$app = new "\Application\" . $ver . "\App()";

应用程序.php:

namespace Application;  
class App {

}

标签: phpnamespacescomposer-phpautoloadpsr-4

解决方案


您必须遵循 PSR-4 的类命名和应用程序结构:

composer.json
    "autoload": {
        "psr-4": {
            "Application\\": "main"
        }
    }
main/V1/App.php
    namespace Application\V1;
    class App {}

例如具有动态名称的类使用下一个构造:

$ver = "V2"; // suppose its V2 for now
$appClass = "\Application\$ver\App";
$app = new $appClass;

在此处阅读有关此的更多信息

我建议在这种情况下使用工厂模式:

class App implements AppInterface {}
class AppFactory
{
    public static function makeApp(string $version): AppInterface
    {
         $appClass = "\Application\$version\App";
         if(! class_exists($appClass){
             throw new Exception("App version $version not exists");
         }
         return new $appClass;
    }
}

推荐阅读