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
'source' 카테고리의 다른 글
설치된 Python 버전은 무엇입니까? (0) | 2022.12.05 |
---|---|
각 그룹에 대한 카운트를 가져오지만 각 그룹의 결과 행 N개 이후 카운트를 중지합니다. (0) | 2022.12.05 |
객체 속성에 직접 할당된 호출 종료 (0) | 2022.12.05 |
Python에서 같은 줄에 여러 개의 인쇄물 (0) | 2022.12.05 |
JavaScript에는 스트링빌더 클래스가 내장되어 있습니까? (0) | 2022.12.05 |