2016-10-20 24 views
1

我有一個composer包,用於內部項目。歷史上,此包中的所有課程都通過"autoload": { "classmap": ... }進行自動加載,並且尚未構建。驗證PSR-4文件/類結構(無痛遷移到PSR-4)

現在我想遷移到PSR-4。我根據類名稱空間對所有文件和目錄進行了重新排序。名稱空間或類名稱沒有改變,只有文件位置/名稱是。

如何驗證我的新文件/類結構以確保其符合PSR-4,並且所有類都可以通過"autoload": { "psr-4": ... }加載?我做了一個谷歌搜索,但沒有找到任何工具。

回答

0

我能夠使用來自Jakub Zalas的答案(選項2)的提示來解決我的問題。

的想法是:

  1. 複製作曲家的工作autoload_classmap.phpautoload_classmap-orig.php
  2. 重新排列類/根據需要更改composer.json
  3. 根據orig classmap測試新的自動加載。

要包括一個類的源文件automaticaly定義了另一個類時避免情況(即超過一類在一個文件中定義),每個類應該在乾淨的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 
1

選項1

運行測試。

無論何時他們是自動或手動的,他們都會顯示任何無法自動加載的類。

選項2

寫一個簡單的腳本,將:

  • 列表中的所有PHP類(FQCNs)
  • 包括作曲家自動加載磁帶機(帶PSR4配置)
  • 爲每個類嘗試撥打class_exists(這將觸發自動加載)

如果給定類的class_exists失敗,則表示其命名空間未正確配置。

+0

謝謝你的提示!我將如何列出所有PHP類(FQCN)?有沒有任何工具(我可以寫一些grep/sed/awk,但如果有工具,它會更可靠)。 – cronfy