2016-11-26 75 views
0

我有一組包含類(實體)的PHP文件。每個類都有相同的命名空間:PHP - Doctrine - 如何自動加載實體類使用單個命名空間

// src/App/Entity/Actions.php 

namespace App\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Actions 
* 
* @ORM\Entity 
*/ 
class Actions 
{ 
// SOME CODE 

我自動加載包含與作曲家類的PHP文件:

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

而且在我的bootstrap.php文件,我加入這一行:

use App\Entity; 

所以我想,因爲告訴應用程序使用App \ Entity命名空間,我可以像這樣調用實體類:$entity = new Actions();

但是當我嘗試,我得到這個錯誤:

Fatal error: Class 'Actions' not found in C:\wamp64\www\spider\chebi2\inc\orm_tools.php on line 49

如果我這樣做:

use App\Entity; use App\Repository; 

if (class_exists('Actions')) { dump('exists'); } else { dump('not exists'); } 

if (class_exists('\App\Entity\Actions')) { dump('exists'); } else { dump('not exists'); } 

繼承人它所輸出:

PS C:\wamp64\www\spider\chebi2> php .\get_actions.php 
"not exists" 
"exists" 

所以它只能找到當我提供完整的命名空間的時候。而古怪的是,當我嘗試這樣做:

// Direct path to the Actions.php file 
use App\Entity\Actions; 

if (class_exists('Actions')) { dump('exists'); } 
else { dump('not exists'); } 

if (class_exists('\App\Entity\Actions')) { dump('exists'); } 
else { dump('not exists'); } 

我得到了相同的結果:

PS C:\wamp64\www\spider\chebi2> php .\get_actions.php 
"not exists" 
"exists" 

所以現在我更糊塗了。如果它實際上沒有使該名稱空間中的類直接可用,那麼使用什麼要點:use App\Entity;?爲什麼分配直接路徑use App\Entity\Actions;甚至不能正常工作?

我在這裏做錯了什麼?有沒有一種正確的方法來使用我不理解的命名空間?

回答

1

PSR-0 depracated你應該使用PSR-4

PSR-4

composer.json

"autoload": { 
    "psr-4": { 
     "App\\": "src/", 
    } 
} 

在src /目錄是在同一水平作曲家.json添加目錄Entity所以在路徑src/Entity添加類文件Actions

namespace App\Entity; 

class Actions 
{ 

} 

您還可以使用composer dump-autoload並檢查供應商/作曲家/自動加載* fiels並查看名稱空間是否在此處註冊。

關於class_exists()它不適用於短名或別名,您需要提供類的全名。我建議使用::class運營商因此,在您的情況下它將是:

<?php 
    use App\Entity\Actions; 

    class_exists(Actions::class); 
0

謝謝!我改變了自動加載器PSR-4,它連接到這一點:

"psr-4": { 
     "App\\": "src/" 
    } 

轉儲自動加載正是我一直在尋找,但我沒有看到任何包含列出的文件或類:

PS C:\wamp64\www\spider\chebi2> composer dump-autoload -vvv 
    Reading ./composer.json 
    Loading config file ./composer.json 
    Checked CA file C:\Users\horse\AppData\Local\Temp\composer-cacert-12fdaece071ee9515fa28aabed5ab089876ae257833106e15a583e060eaff6b5.pem: valid 
    Executing command (C:\wamp64\www\spider\chebi2): git branch --no-color --no-abbrev -v 
    Executing command (C:\wamp64\www\spider\chebi2): git describe --exact-match --tags 
    Executing command (C:\wamp64\www\spider\chebi2): git log --pretty="%H" -n1 HEAD 
    Reading C:/Users/horse/AppData/Roaming/Composer/composer.json 
    Loading config file C:/Users/horse/AppData/Roaming/Composer/composer.json 
    Reading C:\wamp64\www\spider\chebi2/vendor/composer/installed.json 
    Reading C:/Users/horse/AppData/Roaming/Composer/vendor/composer/installed.json 
    Running 1.2.2 (2016-11-03 17:43:15) with PHP 5.6.25 on Windows NT/10.0 
    Generating autoload file 

我還是找不到實體類。

爲了澄清,我應該有文件夾結構是這樣的:

- src (contains only subdirectories) 
    - Entity (contains the entity files) 
    - Repositories 
    - App (empty) 
+0

看看'「/vendor/autoload.php」;' – Robert

+0

的autoload.php文件本身只有兩個在它的線條,但我檢查了vendor/composer/autoload_psr4.php文件,它列出了** composer.json **文件中的所有軟件包,但沒有列出應該使用psr4自動加載器自動加載的任何文件。在** autoload_namespaces.php **中,它不會列出我添加的任何名稱空間。當我運行** composer diagnose **時,其中一行是這樣的:'屬性psr-4沒有被定義,並且定義不允許附加屬性' –

+0

所以在讀完一些東西之後,似乎我誤解了'使用某些\命名空間'命令是做什麼的。我認爲'使用App \ Entity;'會將該名字空間中每個類的名稱加載到全局變量中,但實際上做的是創建爲名爲Entity的別名。所以相反,我需要像這樣調用類\ Entity \ Actions。我不明白它,因爲我通過作曲家安裝了很多不同的組件,我添加了'use path \ to \ namespace;',然後我可以直接調用這些類。 –

相關問題