2016-10-20 11 views
1

私は内部プロジェクトで使用されるコンポーザーパッケージを持っています。歴史的には、このパッケージのすべてのクラスは"autoload": { "classmap": ... }で自動ロードされ、構造化されていませんでした。PSR-4ファイル/クラス構造を検証する(PSR-4に簡単に移行)

今PSR-4に移行したいと思います。私はクラスの名前空間に従ってすべてのファイルとディレクトリを並べ替えました。名前空間またはクラス名は変更されず、ファイルの場所/名前のみが変更されました。

新しいファイル/クラス構造を検証してPSR-4に準拠し、すべてのクラスを"autoload": { "psr-4": ... }でロードできるようにするにはどうすればよいですか?私はGoogleの検索をしましたが、そのためのツールは見つかりませんでした。

答えて

0

ヒントを使用して私の問題を解決することができましたJakub Zalasの答え(オプション2)。 autoload_classmap-orig.php

  1. コピー作曲家の作業autoload_classmap.php

    アイデアはにあります。

  2. 必要に応じてクラスを再調整/変更composer.json
  3. origクラスマップに対する新しい自動ロードをテストします。

1クラスのソースファイルを含めると状況を回避するにはautomaticaly別のクラス定義(すなわちを。複数のクラスを1つのファイルで定義されている)、各クラスには、クリーンな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

だろう簡単なスクリプトを書く:各クラスのために(設定PSR4付き)作曲のオートローダー

  • が含ま

    • リストのすべてのPHPクラス(FQCNs)
    • class_existsに電話をかけてください(オートローディングを起動します)

    与えられたクラスに対してclass_existsが失敗すると、その名前空間が正しく構成されていないことを意味します。

  • +0

    ヒントをありがとう!どのようにすべてのPHPクラス(FQCN)を一覧表示しますか?そのためのツールはありますか(grep/sed/awkを書くこともできますが、ツールがあればより信頼性があります)。 – cronfy

    関連する問題