Bonjour,

je part de mysqlconnect pour PDO etc... j'ai regarder la doc et installer composer j'y avais mis (mes) library et là je dois use les mienne.

J'ai donc ajouté un PSR4

{
    "name": "neecride/mycms",
    "authors": [
        {
            "name": "neecride"
        }
    ],
    "autoload": {
      "psr-4": {
        "App\\": "App/"
      }
    },
    "require": {
        "altorouter/altorouter": "^2.0",
        "erusev/parsedown-extra": "^0.8.1",
        "aidantwoods/secureparsedown": "^1.0",
        "erusev/parsedown": "^1.7",
        "ausi/slug-generator": "^1.1"
      }
}

J'ai créer une class dans le dossier que j'ai affecter, fait un dump-autoload, mais ma class reste not found.

$test = new App\ClassTest;
$test->Test();

Elle fonctionne quand j'inclu le fichier mais pas avec l'autoloader de composer require "../App/Test/Test.php"; j'ai refait un init mais toujour rien.

J'ai du faire une erreur mais je ne la detecte pas, a savoir que j'ai modifier la racine sur le dossier public.

Bonne journée !

10 réponses


quenti77
Réponse acceptée

Hello,

1) Pourquoi ajouter au nom de la classe "Class" ?

Ensuite sur linux alors normal que ça ne fonctionne pas et peut-être aussi sur windows si dans le composer.json le nom du dossier tu mets "App" mais que le dossier du projet c'est "app". Il faut bien respecter la casse dans le nom des dossiers et des fichiers.

Cela nous donne :

{
  "name": "neecride/mycms",
  "authors": [
    {
      "name": "neecride"
    }
  ],
  "autoload": {
    "psr-4": {
      "App\\": "app/"
    }
  },
  "require": {
    "altorouter/altorouter": "^2.0",
    "erusev/parsedown-extra": "^0.8.1",
    "aidantwoods/secureparsedown": "^1.0",
    "erusev/parsedown": "^1.7",
    "ausi/slug-generator": "^1.1"
  }
}

Puis dans le dossier app (avec un "a" minuscule) tu as ta classe "Test" (pas besoin de préfix) :

<?php

namespace App;

/**
 * ! juste un test
 */
class Test
{

  public function show()
  {
    echo "Je suis un test";
  }
}

Et enfin dans un fichier index.php dans le dossier public par exemple tu fais :

<?php

require __DIR__ . '/../vendor/autoload.php';

// Soit directement
$monTest = new \App\Test();
$monTest->show();

// Soit avec un 'use'
use App\Test;

$monTest = new Test();
$monTest->show();

Voilà pour l'exemple.

mmh normalement composer utilise les namespaces

En gros t'as fait un psr4 pour dire que par raport à la racine du projet où se trouve composer.json le namespace App doit pointer vers le dossier ./App

Ici c'est bien expliqué: https://coopernet.fr/formation/php/autoload tu peux comparer ce projet avec ce que tu as fait :p

neecride
Auteur

Bonjour popotte, je comprend pas j'ai fait tout comme indiquer j'ai toujours une erreur not found

J'ai bien ma class a la racine de /app.

j'ai donc

/app > Test.php
/public
/vendor
composer.json

Selon le liens que tu m'a donné j'ai aucune erreur ou je suis vraiment très bête ce qui est probable.

Bonne journée.

namespace App;

/**
 * ! juste un test
 */
class ClassTest
{

  public function test()
  {
    echo "test";
  }
}

$test = new App\ClassTest;
$test->Test();
neecride
Auteur

Bonjour, j'ai tester tout ce que tu dit App app que le dossier est A majuscule ou non ne change rien (To be continued)....

l'autoloader est joint comme ça

define('RACINE', dirname(__DIR__)); 
require RACINE'.DS.'vendor'.DS.'autoload.php';

le problème ne viens pas de l'inclution toutes les autre lib fonctionne !!!

Dons ça venez d'ici Class c'est quand même navran qu'un si petit truc puisse faire que ça foire autant, je pensé avoir respecter les nomage ; j'ai vu nulpart dans la doc que Class causerai un bug.

class Test
{

  public function show()
  {
    echo "test";
  }
}

Bon et bien c'est résolue merci.

Bonjour, j'ai tester tout ce que tu dit App app que le dossier est A majuscule ou non ne change rien (To be continued)....

Ce n'est pas parceque ça ne résoud pas que ça ne faisait pas partie du bug. Je viens surtout de t'éviter un soucis quand tu mettra en ligne sur un linux et non pas sur ton local dans windows.

// l'autoloader est joint comme ça
define('RACINE', dirname(__DIR__)); 
require RACINE'.DS.'vendor'.DS.'autoload.php';

Du français et de l'anglais, choisi un peu dans les noms que tu mets et en soit le DS ne sert à rien car tu peux mettre / pour windows aussi. En plus c'est faux vu que DS est dans une chaîne de caractère mdr.

define('ROOT', realpath(__DIR__ . '/../'));
require ROOT . '/vendor/autoload.php';

C'est pourtant la base tu devrais le savoir :)

J'ai testé avec ClassTest et ça fonctionne donc non ce n'est pas ça qui provoquait le soucis. Le soucis venait du fait que le nom du fichier c'était "Test" et le nom de ta classe c'était "ClassTest". C'est le soucis quand on est pas rigoureux ou que l'on pense connaitre les bases mais que ce n'est pas le cas :)

J'ai fait exprès de parler dans ce message comme tu la faits pour te montrer que parler sèchement à un mec qui t'aide c'est pas vraiment le top.
Reste humble envers les autres et évite de parler comme tu le fais car vraiment ça n'apportera rien de bon

neecride
Auteur

Désolé si je t'es paru hautain c'était pas le but, au contraire je suis respectueux des autres j'ai pas toujours les bon mots.

bonne journée.

J'ai pas vu de mauvaise façon de parler XD

Mais sinon oui c'est vrai que le nom du ufichier doit avoir le même nom que la class:

Test.php -> class Test {}

Ensuite faut virer cette partie

$test = new App\ClassTest;
$test->Test();

En principe c'est à l'autoload de faire ça

Eeet en gros c'est tout ce que je peux voir :/ Sit ton code est dans un dépot public tu pourrais filer le lien Github (et si c'est en privé tu peux virer toutes les infos personnelles et pousser le code dans un dépot public)

neecride
Auteur

Bonjour popotte,

Oui ça va maintenant ça avance ça je l'ai bien compris maintenant lol

Oui j'ai bien github mais on va dire que je suis pudique ou plutot pas sur de moi face a l'elite lol

je sais même pas comment parser mes avatars avant j'aurai fait un truc comme ça mais ça fonctionne pas, je suis passer sur twemoji et je veut choices mais ça parle de node npm donc je sais pas il me faudrais une doc pour expliquer la doc mdr

J'ai quand même mis quelques fichiers ça fonctionne étant débuatnt en POO je sais pas si c'est de la chance lol

Bonne soirée.

En vrai vas-y tu peux y aller, ceux qui diront que c'est null sans argument ne sont pas à prendre en compte et au vu du nombre de projet qu'il peut y avoir, ne t'inquiète pas.

Limite si tu mets ton projet, on pourra toujours faire de la review de code si tu veux

Il y a de tout sur Github, des pros qui vont faire la publication de leurs projets Github et les amateurs qui vont publier sur Github sans publier, ou alors vont publier en demandant des avis (et la tu va te retrouver avec plein de pull request et d'issues de la commu xD)

Okay alors pour Node et NPM si tu ne sait pas ce que c'est il faudrait que tu suives une formation sur NodeJS x) Je crois que Grafikart en a fait un

Mais pour faire simple: NodeJS c'est un serveur JS, et NPM c'est... composer, mais en JS

Si tu doit utiliser un package node c''est simple:

npm init -y, ensuite npm i -S LE_PACKAGE_QUE_TU_VEUX_INSTALLER

Ensuite tu va dans un fichier app.js, tu fait un import du package et tu commences à l'utiliser

import TonPackageQueTuAsInstallé from 'package-que-tu-as-installé'

Dans ton index.php tu vas ajouter cette ligne (on va dire que ton fichier app.js est dans assets/js/app.js ^^):

<script src="assets/js/app.js"></script>

Et c'est tout :p

neecride
Auteur

Merci a vous deux,

je suis partie sur un full forum j'ai ramanié tout mon bidule, a la base il y avais tout un système de news, de portfolio une galerie d'image complétement déprécié.

j'ai tout purifié pour me concentré uniquement sur un forum parce que j'ai rien a dire dans un portfolio :)

je devien schyzo a force de me répondre a moi même en local Sniff

Bonne soirée.