【问题标题】:Validate PSR-4 file/class structure (painless migrate to PSR-4)验证 PSR-4 文件/类结构(无痛迁移到 PSR-4)
【发布时间】:2017-03-02 05:32:28
【问题描述】:

我有一个用于内部项目的作曲家包。从历史上看,这个包中的所有类都是通过"autoload": { "classmap": ... } 自动加载的,并且没有被结构化。

现在我想迁移到 PSR-4。我根据类命名空间重新排序了所有文件和目录。命名空间或类名没有改变,只有文件位置/名称被改变了。

如何验证我的新文件/类结构以确保它符合 PSR-4 并且所有类都可以通过 "autoload": { "psr-4": ... } 加载?我进行了谷歌搜索,但没有找到任何工具。

【问题讨论】:

    标签: php composer-php psr-4


    【解决方案1】:

    我能够使用 Jakub Zalas 的回答(选项 2)中的提示解决我的问题。

    这个想法是:

    1. 将作曲家的工作autoload_classmap.php 复制到autoload_classmap-orig.php
    2. 根据需要重新排列课程/更改 composer.json
    3. 针对 orig 类映射测试新的自动加载。

    为避免在包含一个类的源文件时自动定义另一个类(即在一个文件中定义多个类)的情况,每个类都应在干净的php环境中加载(单独的php-cli运行)。

    我为此使用了 2 个脚本:

    类自动加载检查器(check.php):

    <?php
    
    // test if a class, mentioned in autoload_classmap-orig.php at line $num,
    // can be autoloaded. Exit status: 0 - ok, 4 - failed to autoload,
    // 3 - no more classes in autoload_classmap-orig.php
    
    error_reporting(0);
    require_once(__DIR__ . "/vendor/autoload.php");
    
    $num = $argv[1];
    
    $classes = array_keys(include('autoload_classmap-orig.php'));
    
    if (!isset($classes[$num])) {
            exit(3);
    }
    
    $current_class = $classes[$num];
    echo $current_class;
    if (!class_exists($current_class)) {
            exit(4);
    }
    
    exit(0);
    

    迭代器(check.sh)

    #!/usr/bin/env bash
    
    # call ./check.php until all classes are checked or max number
    # of checks reached.
    
    max=500
    num=0
    
    while true ; do
        php ./check.php $num 
        status=$?
        case $status in
            0) echo " - OK" ;;
            3) echo "\nFinished." ; break ;;
            4) echo " - CAN NOT BE AUTOLOADED" ;;
            *) echo " - UNKNOWN ERROR $status" ;;
        esac
    
        num=$(($num + 1))
        if [ "$num" -gt "$max" ] ; then
            echo "\nMax number of classes reached."
            break
        fi
    done
    

    【讨论】:

      【解决方案2】:

      选项 1

      运行你的测试。

      无论是自动还是手动,它们都会显示所有无法自动加载的类。

      选项 2

      编写一个简单的脚本:

      • 列出所有 PHP 类 (FQCN)
      • 包括作曲家自动加载器(配置了 psr4)
      • 为每个类尝试调用class_exists(这将触发自动加载)

      如果给定类的class_exists 失败,则表示其命名空间未正确配置。

      【讨论】:

      • 感谢您的提示!如何列出所有 PHP 类 (FQCN)?是否有任何工具(我可以写一些 grep/sed/awk,但如果有工具会更可靠)。
      猜你喜欢
      • 2018-06-05
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      • 2015-12-10
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      相关资源
      最近更新 更多