Bonjour,

Je crée un projet où j'utilise uniquement l'ORM de CakePHP3 que j'ai chargé via composer. J'ai quelques soucis (à mon avis au niveau des namespaces), puisque l'ORM ne trouve jamais mes classes de table, à moins que j'indique manuellement le className.

$teachersTable = TableRegistry::get('Teachers'); // ne fonctionne pas, obtient par conséquent un objet de type "Table"
$teachersTable = TableRegistry::get('Teachers', ['className' => \App\Model\Table\TeachersTable::class); // fonctionne

Vous me direz que je peux continuer sur cette voie (et c'est vrai mais un peu pénible), mais ça se complique quand je fais :

$query->contain(['Users' => ['UsersDetails']); // l'erreur retournée est : Users is not associated with UsersDetails

J'en déduis que l'ORM ne trouve pas la classe Users et utilise donc la classe Cake\ORM\Table qui ne contient bien évidemment pas mon association.

Quelqu'un aurait une idée de comment régler ça ?

Merci d'avance et bon après-midi

5 réponses


Bonjour.
Il te faut créer les classes correspondantes et y définir les associations concernées.

kinkaz
Auteur

Bonjour.

Merci pour ta réponse.

J'ai oublié de préciser que les classes de table (entités aussi d'ailleurs) existent bel et bien déjà, j'y ai aussi inclus les associations. Le contain fonctionne très bien depuis un site "full" CakePHP, c'est uniquement lorsque j'utilise que l'ORM (depuis Slim Framework v3) que le "lien" ne se fait plus.

Mes classes de table sont toutes dans le namespace App\Model\Table, les entités dans App\Model\Entity et mes contrôleurs dans App\Controller. En gros, j'ai respecté la "nomenclature" des namespaces de CakePHP pour éviter ce genre de problème.

D'ailleurs, dans mon contrôleur :

TableRegistry::get('Teachers', ['className' => App\Model\Table\TeachersTable::class]); // ne fonctionne pas
TableRegistry::get('Teachers', ['className' => \App\Model\Table\TeachersTable::class]); // fonctionne 

J'ai imaginé que le même problème se produit lorsque l'ORM cherche mes classes de table. Il cherche peut-être sous App\Model\Table alors qu'il faudrait aller voir sous \App\Model\Table.

Montres-nous comment est déclaré ton namespace App dans ton composer.json, si tu ne l'y as pas défini ou que tu l'as défini avec \App c'est normal qu'il ne trouve pas le namespace App.
Si tu définis correctement le namespace tout en te conformant un minimum aux conventions de CakePHP, tu auras beaucoup moins de problème envers son ORM.

kinkaz
Auteur

Il me semble justement bien que je suis les conventions, ou alors quelque chose m'échappe :-)

Alors dans composer.json :

{
    "require": {
        "slim/slim": "^3.0",
        "cakephp/orm": "^3.2",
        "cakephp/validation": "^3.2",
        "giggsey/libphonenumber-for-php": "^7.3",
        "cakephp/i18n": "^3.2",
        "nette/mail": "^2.3"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src"
        }
    }
}

Ce fichier est à la racine de mon site (qui est une API en fait).

Ensuite j'ai (namespaces correspondants aux dossiers, sans le "src" évidemment) :

src/
    Controller/
    Model/
        Table/
            TeachersTable.php
            UsersTable.php
            [...]
        Entity/
vendors/
  cakephp/
    [...]

Merci pour ton aide.

kinkaz
Auteur

Je me permets de faire un petit "up" sur ce message :-)