Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Namespace avec MVC


Sujet :

Langage PHP

  1. ###raw>post.musername###
    Membre régulier
    Namespace avec MVC
    Bonjour,

    J'ai une erreur
    Error: Class 'controller\\WebService' not found in C:\\wamp64\\www\\ibanV4\\controller\\controller.php on line <i>55</i
    lorsque je mets ma class WebService dans mon dossier model, donc quand je veux faire du MVC. Et je ne comprend pas pourquoi...

    Si je mets ma class WebService dans le namespace global iban ça fonctionne.

    mon controller
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    <?php
    namespace controller;
     
    require_once __DIR__ . '/../vendor/autoload.php';
     
    use IBAN;
    use model\WebService;
     
    if(!empty($_GET)) {
        //extract($_POST);//extrait les données du POST et permet de les pouvoir appeler les variables contenuent dans le POST $variable
        $iban = $_GET['iban'];
        $myIban = new IBAN($iban);
     
        $errors = [];//Tableau qui contiendra les erreurs s'il y en a.
        $valid = [];//Tableau qui contiendra les messages valides
     
        //si le champs IBAN est vide, je mets le message d'erreur dans le tableau des erreurs
        if(empty($iban)) {
            array_push($errors, 'Vous devez rentrer votre IBAN!');
        }
     
        //Vérifiez un numéro IBAN. Tolère les espaces, les préfixes "IBAN ...", les tirets, les entrées en minuscules, etc.
        if(!$myIban->Verify()) {
            array_push($errors, 'IBAN invalide! Mauvais format!');
        }
     
        //Vérifier la somme de contrôle d'un IBAN - code modifié à partir de la classe Validate_Finance PEAR
        if(!$myIban->VerifyChecksum()) {
            array_push($errors, 'IBAN invalide! Erreur checksum!');
        }
     
        //Suggestion ou double suggestion si erreur ça dépend des cas et ça ne fonctionne pas toujours
        $suggestions = $myIban->MistranscriptionSuggestions($iban);
        if (is_array($suggestions)) {
            if (count($suggestions) == 1) {
                array_push($errors, "Vous voulez dire: " . $suggestions[0] . " ?");
            } elseif (count($suggestions) > 1) {
                array_push($errors, "ou peut-être: ");
                $done = 0;
                foreach ($suggestions as $suggestion) {
                    if ($done > 0) {
                        array_push($errors, "ou");
                    }
                    array_push($errors, "'" . $suggestion . "'");
                    $done++;
                }
            }
        }
     
        //si pas d'erreurs
        if($myIban->Verify() === true) {
            array_push($valid, "IBAN valide ");//S'il n'y a pas d'erreur
            $pays = $myIban->Country();
            if($pays=="BE") {//si l'IBAN commence par BE
                $ws = new WebService;//Utilisation de ma class WebService
                $bban = $ws->getBelgianBBAN($iban);//je le transforme en BBAN via la methode de ma class WebService
                array_push($valid, 'BBAN: ' . $bban);//je pousse le BBAN dans le tableau de messages valides
            }
        }
     
        //s'il y a des erreurs, je les stock dans une variable $response qui sera envoyée au navigateur
        if(count($errors)) {
            $response = ['errors'=>$errors];
            echo json_encode($response);//j'encode la réponse au format JSON
            exit;
        }
     
        //s'il y a des messages valides je les stock dans une variable $response qui sera envoyée au navigateur
        if(count($valid)) {
            $response = ['success'=>$valid];
            echo json_encode($response);//j'encode la réponse au format JSON
            exit;
        }
     
    }


    ma class WebService
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php
    namespace model;
     
    require_once __DIR__ . '/../vendor/autoload.php';
     
    use IBAN as Iban;
    use SoapClient;
     
    class WebService extends Iban
    {
        public function getBelgianBBAN($iban)
        {
            $url = "http://www.ibanbic.be/IBANBIC.asmx?WSDL";
            $client = new SoapClient($url);
            $bban = $client->getBelgianBBAN(array('Value' => $iban))->getBelgianBBANResult;
            return $bban;
        }
    }


    la structure de mon programme
      0  0

  2. ###raw>post.musername###
    Membre éprouvé
    bonjour,
    dans controller faudra inclure le fichier WebService.php
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    namespace controller;
     
    require_once __DIR__ . '/../vendor/autoload.php';
     
    require_once dirname(__DIR__).'/model/WebService.php'; //<-
     
     
    use IBAN;
    use model\WebService;


    Il existe une méthode plus élégante d'inclusion de tous fichiers qui consiste à utiliser l'autoloader de composer.json. Dans la section autoload du composer.json tu peux décider de charger toutes les classes qui ont un namespace qui commencent par model, controller se trouvant respectivement dans les dossiers controller et model:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    {
     
     
        "autoload": {
          "psr-4": {
              "controller\\": "controller/",
              "model\\": "model/"
          }
        }
    }

    ensuite régéner un nouveau fichier d'autoload du composer en tapant la commande : composer dumpautoload .
    en utilisant l'autoloader du composer tu n'auras plus besoin d'inclure le fichier un a un.
      1  0

  3. #3
    Membre régulier
    Merci, ça fonctionne très bien avec la méthode élégante.
    ça fait un moment que je cherche comment faire fonctionner ça.

    Un grand MERCI