2016-10-20 5 views
1

내부 프로젝트에서 사용되는 작성자 패키지가 있습니다. 역사적으로이 패키지의 모든 클래스는 "autoload": { "classmap": ... }을 통해 자동로드되었으며 구조화되지 않았습니다.PSR-4 파일/클래스 구조 유효성 검사 (PSR-4로 간편하게 마이그레이션)

이제 PSR-4로 마이그레이션하고 싶습니다. 클래스 네임 스페이스에 따라 모든 파일과 디렉토리를 재정렬했습니다. 네임 스페이스 또는 클래스 이름은 변경되지 않았으며 파일 위치/이름 만 변경되었습니다.

새 파일/클래스 구조가 PSR-4를 준수하는지 확인하고 모든 클래스를 "autoload": { "psr-4": ... }을 통해로드 할 수 있는지 확인하려면 어떻게합니까? 나는 Google 검색을 만들었지 만 그 도구를 찾지 못했습니다.

답변

0

힌트를 사용하여 의 Jakub Zalas의 답변 (옵션 2)에서 문제를 해결할 수있었습니다. 복사 작곡가의이 autoload_classmap-orig.phpautoload_classmap.php 작업

  1. :에

    생각입니다.

  2. 클래스를 재정렬/변경하려면 composer.json 필요에 따라
  3. orig 클래스 맵에 대한 새로운 자동로드를 테스트합니다. 한 클래스의 소스 파일보기 자동 다른 클래스 정의를 포함 할 때

는 상황을 방지하려면 (전. 전자. 하나 개 이상의 클래스가 하나 개의 파일에 정의되어 있습니다), 각 클래스는 깨끗한 PHP 환경 (별도의 PHP-CLI 실행)에로드해야합니다.

클래스의 자동로드 검사기 (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

힌트 주셔서 감사합니다

는 그 2 스크립트를 사용! 모든 PHP 클래스 (FQCN)를 어떻게 나열합니까? 거기에 대한 어떤 도구가 있습니까 (내가 grep/sed/awk 작성할 수 있지만 더 신뢰할 수있는 도구가있는 경우). – cronfy