2017-07-13 2 views
0

Je suis aux prises avec PHP Namespaces et Auto loading dans Laravel 5.4. En fait, je décidé de mettre les modèles que je dois utiliser dans un certain et nommé dossier comme app/Models:
Classe non trouvée après le chargement automatique dans Laravel

php artisan make:model Models/Customer

J'ai mis l'espace de noms de modèle client à namespace Models;
Ensuite, j'ai créé un itinéraire comme suit:

Route::get('customer', function() { 
    $customer = \App\Models\Cutomer::find(1); 
    echo $customer; 
}); 


Pour faire un travail de chargement automatique I a ouvert le fichier composer.json situé dans la racine très fo lder du projet Laravel et fait le autoload être la suivante:

"autoload": { 
    "classmap": [ 
     "database", 
     "app/Models" 
    ], 
    "psr-4": { 
     "App\\": "app/", 
     "App\\Models\\": "App/Models" 
    } 
}, 

Après tout cela, je vérifié si mon compositeur est une version de mise à jour et couru dump-autoload:

composer self-update 
composer dump-autoload -o 

Il est également la valeur de préavis le contenu de vendor/composer/autoload_classmap.php:

'App\\Models\\Customer' => $baseDir . '/app/Models/Customer.php', 
'App\\Models\\Test\\Test' => $baseDir . '/app/Models/Test.php', 

Mon problème est que chaque fois que j'exécute l'url: http://127.0.0.1:8000/customer je vais rencontrer la sortie d'erreur suivant:

(1/1) FatalThrowableError 
Class 'App\Models\Cutomer' not found 

Voulez-vous s'il vous plaît me aider à comprendre où mon travail a été incorrect, et comment y remédier? Merci beaucoup d'avance.

+1

Vous avez une faute de frappe.Le modèle est 'Client', mais vous essayez d'utiliser' Cutomer' –

Répondre

1

L'espace de noms dans le modèle doit être namespace App\Model; (donc pourquoi vous appelez la classe comme \App\Models\Cutomer)

Lorsque vous utilisez php artisan make:model Models/Customer il aurait dû définir correctement alors l'espace de noms.

De même, vous n'avez pas besoin d'éditer votre composer.json pour ce faire. Supprimez les ajouts que vous avez apportés à votre fichier composer.json pour l'autoloading, puis exécutez composer dumpautoload à partir de la ligne de commande.

Espérons que cela aide!

+0

Merci à vous trois de m'aider à résoudre mon problème. Je devrais non seulement avoir prêté attention à 'namespacing' mais j'ai aussi eu une faute de frappe. Vous avez tous sauvé ma journée. Encore merci beaucoup. – Tower

+0

Content de pouvoir aider! :) –

1

Tout d'abord, vous avez une erreur dans la configuration de votre PSR-4.

"App\\Models\\": "App/Models"

Cela ne correspond pas à un répertoire valide. Deuxièmement, et plus important encore, il n'est pas nécessaire de charger automatiquement un espace de noms imbriqué d'un espace de noms déjà déclaré. En chargeant automatiquement App, vous chargez automatiquement tous les espaces de noms imbriqués à condition qu'ils soient conformes à l'espace de noms i.e des normes PSR-4 en tant que nom de répertoire et nom de fichier en tant que nom de classe.

configuration Composer doit seulement être les suivantes:

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