Bonjour,
je travail avec cakephp 3 et j'ai créé une classe personnel ou j'ai mis des fonctions que je vais utilisé tout au long de l'application, j'ai mis la clases dans un dossier Lib dans src, mais je sais pas comment charger cette classe, avec cakephp 2 c'etait facile

App::import('Lib', 'Dbfconsole');

Mais avec cakephp 3 j'avoue que je suis perdu.
merci pour votre aide.

9 réponses


JC_Pires
Réponse acceptée

Ce que tu peut faire, c'est la mettre dans ton dossier Vendor, et la charger avec composer.
Tu lui mets un Namespace, et le tour est joué, l'exemple ici traite d'une classe qui est nommée "TSStatus" que j'ai mis dans l'autoload de composer:

   {
      "name": "cakephp/app",
      "description": "CakePHP skeleton app",
      "homepage": "http://cakephp.org",
      "type": "project",
      "license": "MIT",
      "require": {
          "php": ">=5.4.16",
          "cakephp/cakephp": "~3.0",
          "mobiledetect/mobiledetectlib": "2.*",
          "cakephp/migrations": "@stable"
          "cakephp/plugin-installer": "*"
      },
      "require-dev": {
          "psy/psysh": "@stable",
          "cakephp/debug_kit": "~3.0",
          "cakephp/bake": "~1.0"
      },
      "suggest": {
          "phpunit/phpunit": "Allows automated tests to be run without system-wide install.",
          "cakephp/cakephp-codesniffer": "Allows to check the code against the coding standards used in CakePHP."
      },
      "autoload": {
          "psr-4": {
              "App\\": "src",
               "TSStatus\\": "vendor/tsviewer" // ICI ma classe perso
          }
      },
      "autoload-dev": {
          "psr-4": {
              "App\\Test\\": "tests",
              "Cake\\Test\\": "./vendor/cakephp/cakephp/tests"
          }
      },
      "scripts": {
          "post-install-cmd": "App\\Console\\Installer::postInstall",
          "post-autoload-dump": "Cake\\Composer\\Installer\\PluginInstaller::postAutoloadDump"
      },
      "minimum-stability": "dev",
      "prefer-stable": true
  }

Une fois fais, un petit composer dumpautoload et hop c'est fait

JC_Pires
Réponse acceptée

N'oublie pas de mettre un use en début de ton fichier "Controller/Model" exemple pour ma Classe TSStatus dont j'ai besoin dans mon AppController:

  <?php
  namespace App\Controller;

  use Cake\Controller\Controller;
  use Cake\Event\Event;
  use TSStatus\TSStatus; // <= ICI le use
JC_Pires
Réponse acceptée

Tu as fais un:

    composer dumpautoload 

pour recharger l'autoloader?

Xeta
Réponse acceptée

Hello,
Le dossier vendor est plus réservés au librairies installées avec composer, pour des fichiers simples, utilise le dossier src :

src/
    Lib/
        Dbfconsole.php

Pour l'utiliser :

use App\Lib\Dbfconsole;
Dbfconsole::encode($id)
JC_Pires
Réponse acceptée

Oui j'y ai pensé lorsque je t'avais dis de rajouter le use. Xeta à raison il vaudrais mieux garder cette nomenclature

kjebbour
Auteur

Merci Jean-christophe Pires pour ta réponse rapide,
j'ai fais la meme chose en ajoutant ma classe Dbfconsole dans vendor, m'ai quand j'essai d'appeler une fonction de cette classe dans mon view

Dbfconsole::encode()

ca me génére une erreur

Error: Class 'Dbfconsole' not found 

merci pour vos réponses.

kjebbour
Auteur

Merci Jean-christophe Pires,
Voila comment j'ai procédé:
j'ai créé un dossier dbfconsole dans vendor, j'ai y mis ma classe

namespace Dbfconsole;

class Dbfconsole
{
    static $encodehash = '2965';

    public function encode($value) {
        if (empty($value)){
            return "";
        }
        return Security::encrypt($value, $encodehash);
    }

    public function decode($code) {
        if (empty($code)){
            return "";
        }
        return Security::decrypt($code, $encodehash);
    }

}

dans le composer j'ai mis:

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

et dans mon AppController j'ai ajouter:

use Dbfconsole\Dbfconsole;

dans mon view j'ai appelé la fonction encode:

Dbfconsole::encode($id)

mais j'ai toujours cette erreur:

Error: Class 'Dbfconsole' not found 
kjebbour
Auteur

Re-Bonjour,
super !! ça marche now. Je vous remercie vivement pour vos réponses et pour le temps que vous avez consacré à mon problème, je vous souhaite une excellente journée (Jean-christophe Pires, Xeta ).

Ce qui est cool, c'est qu'on a pus te montrer 2 méthodes differentes, bonne journée à toi.