Bonjour à tous, je viens ici pour vous poser une petite question, après des tests du CakePHP\ORM disponible hors du corps de CakePHP, j'ai remarqué que les accesseurs & Mutateurs ne fonctionnez pas... Petite application tout basique est simple un système d'actualité.

  • Un champ title (pour titre)
  • Un champ content (pour contenu)
  • Un champ pour category_id (L'ID de la catégorie)

Lors du débogue j'ai :

object(App\Model\Entity\Post)[71]
  protected '_accessible' => 
    array (size=2)
      '*' => boolean true
      'id' => boolean false
  protected '_properties' => 
    array (size=9)
      'id' => int 1
      'title' => string 'mon premier article' (length=19)
      'slug' => string 'mon-premier-article' (length=19)
      'content' => string 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae scelerisque turpis. Mauris sed mollis quam. Donec non aliquam mauris. Aenean nunc odio, ultricies at pulvinar at, sollicitudin vel ex. Aenean ac commodo purus. Fusce viverra viverra aliquet. Curabitur nibh lorem, commodo in ex eget, sollicitudin cursus velit. Praesent facilisis ante nec massa feugiat, ut laoreet ligula varius. Cras eu ex in felis fermentum feugiat. Curabitur tristique dolor vel lorem vestibulum efficitur. Nunc vitae egest'... (length=2594)
      'category_id' => int 1

Mon "title", et en minuscule alors j'ai décidé de faire un _getTitle(){}

protected function _getTitle($title) {
        return ucfirst($title);
    }

Je me retrouve donc avec cela :

'title' => string 'mon premier article' (length=19)

Le _getTitle(); n'a donc pas été effectuer...

J'ai donc essayer :

getTitle($title) {
return ucfirst($title);
}
// Où
__getTitle($title) {
return ucfirst($title);
}

Rien n'y fait...

Après avoir donc C/C (Copier/Coller) le code de la documentation : http://book.cakephp.org/3.0/fr/orm/entities.html#accesseurs-mutateurs

Rien ne ce passe non plus...

Auriez-vous une idée ?

Merci.

8 réponses


Xen0risDEV
Auteur
Réponse acceptée

EDIT : Après un /etc/init.d/apache2 restart, cela semble fonctionné ! Merci beaucoup à PhiSyX.

Salut, c'est normal. Les données sont intactes lors d'un var_dump/print_r,... mais tu peux voir le résultat final en encodant les données en JSON. (echo json_encode($post, JSON_PRETTY_PRINT))
Sinon effectivement, pour que ça prenne effet, il faut l'appeller avec un "$post->title". (principe du getter)
Si ça ne fonctionne toujours pas, dans quelle classe as-tu écrite ta méthode _getTitle? ^^

Bonjour, dans mon fichier Entity (Posts extends Entity), pour ma vue j'appelle : $post->title . ':' . $post->category->title;.
Quand au JSON ses le même que le "var_dump/print_r".

Post extends Entity, plutôt non (sans le s à Posts)? Vu ton object(App\Model\Entity\Post)[71].
Si le JSON te retourne le même résultat c'est que ta classe Entity (Post) n'est pas prise en compte.
Vérifie le namespace s'il est correct par rapport a ton architecture, le nom de la classe de ton entité…

En tout cas, chez moi ça fonctionne. (orm only)

Bonjour,

La fonction de récupération :

public function index() {
        $this->title_for_layout = 'Actualité';
        $this->loadModel('Post');

        $d['posts'] = $this->Post->db
            ->find()
            ->contain(['Categories'])
            ->order(['created_at' => 'DESC'])
            ->all();

        $this->set($d);
    }

Mon fichier PostsTable :

<?php
namespace App\Model\Table;
use Cake\ORM\Table;

Class PostsTable extends Table {
    public function initialize(array $config) {
        $this->entityClass('\App\Model\Entity\Post');
        $this->belongsTo('Categories', [
            'foreignKey' => 'category_id',
            'joinType' => 'INNER'
        ]);
    }
}

Mon fichier Post :

<?php
namespace App\Model\Entity;

use Cake\ORM\Entity;
use Cake\Utility\Inflector;

Class Post extends Entity {
    protected $_accessible = [
        '*' => true,
        'id' => false
    ];

    protected function _getTitle($title) {
        return ucfirst($title);
    }

    protected function _setTitle($title) {
        $this->set('slug', Inflector::slug($title));

        return $title;
    }
}

Il me retourne toujours : 'title' => string 'mon premier article' (length=19) :(

Etrange.

Même en copiant ton code (en mettant mes namespace), j'arrive à avoir le résultat souhaité... (J'ai modifié title et slug dans mon cas.)

Oui, je trouve cela étrange aussi... J'utilise mon propre MVC avec le code de l'ORM de CakePHP j'espère que cela n'impact rien au bon fonctionnement de CakePHP..

Ceci étant dit j'ai repris le même code que sur le que sur votre screen cela ne fonctionne pas...

Controller.php:66-72 :

public function Model($name) {
        if(!isset($this->$name)) {
            $table = $name . 's';
            $class = 'App\Model\Table\\' . $table . 'Table';
            $this->$name = TableRegistry::get($table, ['className' => $class]);
        }
    }   

EDIT : J'ai modifié l'instance d'appel de mais modèle, je ne passe plus par une classe modèle, mais par le contrôleur (voir le code ci-dessus).

Après de nombreux tests, cela ne marche toujours pas... J'ai bon à regarder des vidéos, même celle de Grafikart sortie y a peu de temps... rien n'y fait, je perds totalement espoir.