source

Composer 자동 로드 사용

manycodes 2022. 12. 5. 21:26
반응형

Composer 자동 로드 사용

저는 이 문제에 관해 인터넷을 둘러보고 있지만, 아무런 운이 없습니다.이 코드를 사용하여 작곡가의 자동 로드를 사용하고 있습니다.composer.json:

"autoload": {
    "psr-0": {"AppName": "src/"}
}

단, 벤더 폴더보다 높은 레벨에서 자동 로딩해야 합니다.

다음과 같은 조작은 동작하지 않습니다.

"autoload": {
    "psr-0": {"AppName": "../src/"}
}

수정 방법이나 방법을 아는 사람 있나요?

모든 패키지는 자동 로딩 자체를 담당해야 합니다. 정의한 패키지에서 나온 자동 로딩 클래스로 무엇을 달성하려고 합니까?

응용 프로그램 자체에 대한 한 가지 해결 방법은 다음과 같은 네임스페이스를 로더 인스턴스에 추가하는 것입니다.

<?php

$loader = require 'vendor/autoload.php';
$loader->add('AppName', __DIR__.'/../src/');

Composer 설명서에는 다음과 같이 기술되어 있습니다.

자동 로드 필드를 추가한 후 설치를 다시 실행하여 벤더/자동 로드를 다시 생성해야 합니다.php 파일.

「src」dir가 「vendor」dir와 같은 레벨에 있는 것을 전제로 하고 있습니다.

  • src
    • 앱명
  • 노점상
  • composer.json

다음 설정은 완전히 정확합니다.

{
    "autoload": {
        "psr-0": {"AppName": "src/"}
    }
}

그러나 종속성을 다시 업데이트/설치해야 작동합니다. 예를 들어 다음과 같은 작업을 수행합니다.

php composer.phar update

이 명령어는 의존 관계의 최신 버전을 가져오고 "vendor/composer/autoload_namespaces.php" 파일을 설정에 맞게 업데이트합니다.

또한 @Dom에서 설명한 바와 같이composer dump-autoload업데이트를 거치지 않고 오토로더를 업데이트합니다.

또한 작곡가의 자동 로드 기능을 사용하는 다른 방법도 있습니다.네임스페이스 없이 패키지를 로드하거나 사용자 정의 자동 로드 기능이 포함된 패키지를 로드하는 데 유용한 방법입니다.

예를 들어 자동 로드 기능이 포함된 단일 파일을 포함하려면 다음과 같이 "files" 지시문을 사용할 수 있습니다.

"autoload": {
    "psr-0": {
        "": "src/",
        "SymfonyStandard": "app/"
    },
    "files": ["vendor/wordnik/wordnik-php/wordnik/Swagger.php"]
},

그리고 그 안에Swagger.php파일:

function swagger_autoloader($className) {
    $currentDir = dirname(__FILE__);
    if (file_exists($currentDir . '/' . $className . '.php')) {
        include $currentDir . '/' . $className . '.php';
    } elseif (file_exists($currentDir . '/models/' . $className . '.php')) {
        include $currentDir . '/models/' . $className . '.php';
    }
}
spl_autoload_register('swagger_autoloader');

https://getcomposer.org/doc/04-schema.md#files

그렇지 않으면 클래스 맵 참조를 사용할 수 있습니다.

{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}

https://getcomposer.org/doc/04-schema.md#classmap

주의: 테스트 중에는 반드시 컴포저를 기동해 주십시오.dump-autoload명령어를 입력하지 않으면 변경사항이 표시되지 않습니다.

./composer.phar dump-autoload

해피 오토로딩 =)

제 생각에는, 주어진 질문에 대해 Sergiy의 답변이 선택된 답변이어야 합니다.이해를 나누고 있습니다.

아래 dir 구조에 있는 composer를 사용하여 패키지 파일을 자동 로드하려고 했습니다.

<web-root>
    |--------src/
    |           |--------App/
    |           |
    |           |--------Test/
    |
    |---------library/
    |
    |---------vendor/
    |           |
    |           |---------composer/
    |           |           |---------autoload_psr4.php
    |           |           
    |           |----------autoload.php
    |
    |-----------composer.json
    |

PSR-4 자동 로딩 사양을 사용하고 있습니다.

프로젝트의 composer.json에 아래 행을 추가해야 합니다.클래스 파일을 src/App, src/Test 및 라이브러리 디렉토리에 배치할 예정입니다.

"autoload": {
        "psr-4": {
            "OrgName\\AppType\\AppName\\": ["src/App", "src/Test", "library/"]
        }
    } 

이것은 거의 자기 설명입니다.OrgName\AppType\AppName은 원하는 네임스페이스 접두사입니다.를 들어 src/App/Controller/Provider/User.php의 클래스 사용자 -

namespace OrgName\AppType\AppName\Controller\Provider; // namespace declaration

use OrgName\AppType\AppName\Controller\Provider\User; // when using the class

또, 「src/App」, 「src/Test」…는, 사용의 composer.json 가 있는 Web 루트의 것입니다.벤더와 무관합니다.벤더/자동 로드를 참조해 주세요.php

컴포저가 올바르게 설치되어 있으면 #composer update만 하면 됩니다.

작곡가 업데이트 후 내 클래스가 성공적으로 로드되었습니다.이 컴포저가 벤더/컴포저/autoload_psr4.php에 행을 추가하고 있는 것을 확인했습니다.

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
    'OrgName\\AppType\\AppName\\' => array($baseDir . '/src/App', $baseDir . '/src/Test', $baseDir . '/library'),
);

이게 작곡가의 지도입니다.psr-0의 경우 매핑은 벤더/컴포저/autoload_classmap에 있습니다.php

클래스를 포함하는 폴더를 가리키는 네임스페이스의 symbolink를 src 폴더에 생성하기만 하면 됩니다.

ln -s ../src/AppName ./src/AppName

작곡가의 자동 로드는 똑같아 보입니다...

"autoload": {
    "psr-0": {"AppName": "src/"}
}

AppName 는 "AppName"에 합니다.src★★★★★★★★★★★...그러면 되겠군요.

자동 로드 설정은 벤더 dir 아래에서 시작됩니다.따라서 벤더 dir를 변경하는 것이 좋습니다.

{
    "config": {
        "vendor-dir": "../vendor/"
    },
    "autoload": {
        "psr-0": {"AppName": "src/"}
    }
}

아니면 당신의 프로젝트에서 이것이 가능하지 않나요?

언급URL : https://stackoverflow.com/questions/12818690/using-composers-autoload

반응형