cari

Rumah  >  Soal Jawab  >  teks badan

Autoloading komposer tidak dapat mencari kelas ini

Saya mempunyai projek dengan struktur berikut:

- src
  + Guitar.php
  + Type.php
  + ToString.php
- tests
  + GuitarTest.php
composer.json

Beginilah saya mentakrifkan autoloading psr-4 dalam composer.json:

"autoload": {
    "psr-4": {
        "Shop\Guitar\": "src/"
    }
}

Ini Gitar saya.php:

<?php

namespace Shop\Guitar;

require_once __DIR__ . '/../vendor/autoload.php';

use Shop\Guitar\Type;

class Guitar
{
    public function __construct(public readonly string $serialNumber, public readonly Type $type)
    {
    }
}

Ini ToString.php saya:

<?php

namespace Shop\Guitar;

require_once __DIR__ . '/../vendor/autoload.php';

interface ToString
{
    public function toString(): string;
}

Ini adalah Jenis saya.php:

<?php

namespace Shop\Guitar;

require_once __DIR__ . '/../vendor/autoload.php';

enum Type implements ToString
{
    case ACOUSTIC;
    case ELECTRIC;

    public function toString(): string
    {
        return match($this)
        {
            self::ACOUSTIC => 'Acoustic',
            self::ELECTRIC => 'Electric',
        };
    }
}

Ini GuitarTest saya.php:

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use PHPUnit\Framework\TestCase;
use Shop\Guitar\Guitar;
use Shop\Guitar\Type;

final class InventoryTest extends TestCase
{
    public function testGuitarConstructor(): void
    {
        $guitar = new Guitar('foo', Type::ELECTRIC);
    }
}

Tetapi apabila saya menjalankan ujian, saya mendapat ralat berikut:

Error: Class "Shop\Guitar\Guitar" not found

Apa masalahnya? Bagaimana untuk menyelesaikan?

P粉403804844P粉403804844243 hari yang lalu423

membalas semua(1)saya akan balas

  • P粉764836448

    P粉7648364482024-03-27 12:15:40

    Ini hanyalah soalan tentang pemuat auto Komposer dalam konfigurasi PSR-4.

    • Konfigurasi composer.json anda kelihatan sah.
    • require_once panggilan tidak akan. Ini ialah autoloader, dan fail kelas mestilah tidak memerlukan autoloader.

    Jika ragu-ragu, uji konfigurasi pemuat auto anda.

    Langkah seterusnya:

    1. Alih keluar require_once panggilan itu, ia hanya mengalih perhatian anda dan menghalang penyelesaian masalah. Konfigurasi autoload sama ada sah atau tidak sah. Ia memerlukan lebih banyak penyelenggaraan jika anda menyebarkan mata termasuk ke atas fail yang berbeza, tetapi sama sekali tidak perlu berbuat demikian.

    2. Susun semula 测试modul anda untuk memperkenalkan ujian konfigurasi autoloader kerana anda menghadapi masalah:

      1. Alihkan kandungan dari tests 移至 tests/unit dan sediakan direktori khusus untuk ujian unit.

      2. Dicipta tests/php 子文件夹并在其中创建 autoloading.php 文件。该文件夹用于 PHP 测试,即直接使用 PHP 执行它们(例如 phptests/php/autoloading.php). Kandungan fail:

        Rujukan:

    3. Jalankan ujian konfigurasi autoloader untuk menyemak sama ada fail boleh dimuatkan

      $ php tests/php/autoloading.php
      

    (Ia tidak boleh mencetak apa-apa, tetapi ia mungkin mencetak apa-apa. Perkara penting ialah ia berjalan, dan bukan fail tidak ditemui atau jenis ralat yang serupa.

    Jika anda dapat melaksanakan fail PHP dengan cara ini, ikat ia ke dalam konfigurasi Komposer anda. Ini membolehkan anda menguji konfigurasi autoloader.

    Tambah skrip baharu pada konfigurasi composer.json anda:

    {
        "script": {
            "post-autoload-dump": [
                "@php -dzend.assertions=1 -dassert.exception=0 tests/php/autoloading.php"
            ]
        }
    }
    

    Rujukan:

    dan ujinya:

    $ composer run-script post-autoload-dump
    > @php -dzend.assertions=1 -dassert.exception=0 tests/php/autoloading.php
    PHP Warning:  assert(): [ ...

    (Ia tidak memberikan output, di sini saya menambah beberapa amaran untuk menunjukkan rupanya)

    Ini akan menjalankan ujian konfigurasi autoload baharu dan mendayakan penegasan dalam mod amaran. Iaitu, jika mana-mana ***_exists() fungsi mengembalikan palsu, anda akan melihat ralat. Ini bermakna antara muka/penghitungan/kelas tidak boleh dimuatkan.

    Anda boleh lulus -dassert.exception=0 更改为 -dassert.exception=1 (0 -> <代码>1)。然后测试将以非零代码退出(状态 255 untuk pengecualian yang tidak ditangkap).

    Ini yang anda mahu, akan -dassert.exception=0 更改为 -dassert.exception=1 并再次保存 composer.json .

    Anda kemudian boleh menguji pemuat auto anda menggunakan mana-mana arahan Komposer yang membuang pemuat auto:

    • 作曲家转储自动加载
    • 作曲家安装
    • 作曲家更新

    Selamat mencuba.


    Ujian yang betul, mungkin juga semak sama ada phpunit masih berjalan:

    $ composer exec phpunit -- tests/unit
    PHPUnit ...

    Uji sekali lagi, apabila anda menemui pelakunya dan semuanya kembali normal, anda boleh menjalankan semua ujian menggunakan skrip penulis tunggal.

    Biasa ialah skrip dengan perkataan test:

    {
        "script": {
            "post-autoload-dump": [
                "@php -dzend.assertions=1 -dassert.exception=0 tests/php/autoloading.php"
            ],
            "test": [
              "@composer dump-autoload",
              "@composer exec phpunit"
            ]
        }
    }
    

    Dan anda tidak perlu menulis composer run-script test,只需 composer test sepanjang masa ia sudah cukup:

    $ composer test
    Generating autoload files
    Generated autoload files
    > @php -dzend.assertions=1 -dassert.exception=1 tests/php/autoloading.php
    PHPUnit ...
    Time: 28 ms, Memory: 4.00MB
    
    No tests executed!
    

    (Dalam output contoh ini, saya belum mengkonfigurasi ujian phpunit, tetapi anda mendapat idea)


    Jadi apakah jenis ujian ini? Baiklah, saya memanggilnya ujian konfigurasi, ia hanya semakan pantas di mana anda boleh mengesahkan beberapa perkara PHP. Jangan tambah banyak ujian sedemikian dan pastikan pelan ujian anda kecil. Anda boleh menggunakannya untuk menyelesaikan masalah yang anda hadapi semasa mengkonfigurasi projek anda. Simpan sehingga setahun dan jika anda kekal bebas ralat, maka anda boleh mempertimbangkan untuk memadamkannya.

    Walau bagaimanapun, contoh ini menunjukkan cara untuk mengalihkan beberapa cek lebih dekat ke lokasi yang dikonfigurasikan dan mengikatnya bersama-sama. Jika terdapat status keluar bukan sifar, Komposer akan gagal keseluruhan proses.

    Selain itu, anda boleh menambah penerangan pada setiap skrip penulis supaya mesej dipaparkan:

    {
        "scripts-descriptions": {
            "test": "Runs all tests."
        }
    }
    
    $ composer list
    ...
      test                 Runs all tests.
    ...

    (Lihat: Penerangan Tersuai - Dokumentasi Skrip Komposer)

    balas
    0
  • Batalbalas