Ankündigung

Einklappen
Keine Ankündigung bisher.

Klasse wird über namespace nicht gefunden.

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Klasse wird über namespace nicht gefunden.

    Hallo Zusammen,

    ich versuche das Beispiel hello-word vom Projekt Ratchet zum laufen zu bringen. Das Problem ist, die Klasse Chat.php wird über den namespace nicht gefunden. Vermutlich liegt es daran dass ich den composer nicht manuell installiert habe wie im Beispiel beschrieben sonder den integrierten composer vom PHPStorm verwende.

    Fatal error: Uncaught Error: Class 'Chat' not found in C:\wamp64\www\Uebersetzer\bin\chat-server.php:13


    Das ist die Klasse /src/Chat.php die nicht gefunden wird.
    PHP-Code:
    <?php
    namespace MyApp;
    use 
    Ratchet\MessageComponentInterface;
    use 
    Ratchet\ConnectionInterface;

    class 
    Chat implements MessageComponentInterface {
        public function 
    onOpen(ConnectionInterface $conn) {
        }

        public function 
    onMessage(ConnectionInterface $from$msg) {
        }

        public function 
    onClose(ConnectionInterface $conn) {
        }

        public function 
    onError(ConnectionInterface $conn, \Exception $e) {
        }
    }
    Das ist das php File zum ausführen des Server im Terminal /bin/chat-server-php
    PHP-Code:
    <?php
    use Ratchet\Server\IoServer;
    use 
    MyApp\Chat;

        require 
    dirname(__DIR__) . '/vendor/autoload.php';

        
    $server IoServer::factory(
            new 
    Chat(),                      <<<<<<<<<<<<< hier knallt es weil Chat nicht gefunden wird.
            
    80
        
    );

        
    $server->run();

    Das File composer.json habe ich manuell angepasst und den markierten Bereich eingefügt.
    HTML-Code:
    {
      "name": "vendor_name/package_name",
      "description": "description_text",
      "minimum-stability": "stable",
      "license": "proprietary",
      "authors": [
        {
          "name": "author's name",
          "email": "email@example.com"
        }
      ],
    ----------------------------------------------- diesen Part habe ich manuell in das composer.json eingebaut. Vermutlich liegt hier der Fehler.
      "autoload": {
        "psr-4": {
          "MyApp\": "src"             <<hier ist der namespace und Pfad "src" wo er die Files suchen soll. Doch das wird nicht benutzt.
        }
      },
    -----------------------------------------------
      "require": {
        "cboden/ratchet": "v0.4.1"
      }
    }
    Wenn ich Chat.php einfach nach /bin verschiebe indem auch die chat-server.php sich befindet, bekomme ich die gleiche Fehlermeldung.

    Hat jemand eine Idee?






  • #2
    versuchs Mal mit

    Code:
    {
      "name": "vendor_name/package_name",
      "description": "description_text",
      "minimum-stability": "stable",
      "license": "proprietary",
      "authors": [
        {
          "name": "author's name",
          "email": "email@example.com"
        }
      ],
    ----------------------------------------------
      "autoload": {
        "psr-4": {
          "MyApp\\": "src/"          
        }
      },
    -----------------------------------------------
      "require": {
        "cboden/ratchet": "v0.4.1"
      }
    }
    und rufe danach den update Befehl auf

    EDIT:

    wenn du dein script von bin/chat-sever.php startest, musst du sicher stellen dass der Pfad zum Vendor Ordner korrekt ist.

    PHP-Code:
     <?php
    use Ratchet\Server\IoServer;
    use 
    MyApp\Chat;



    if(!
    is_file(dirname(__DIR__) . '/vendor/autoload.php')){
    echo 
    "File wurde nicht gefunden: ".dirname(__DIR__) . '/vendor/autoload.php'//hier prüfen ob autoload.php da ist

    die();
    }
        require 
    dirname(__DIR__) . '/vendor/autoload.php';
        
    $server IoServer::factory(
            new 
    Chat(),                     
            
    80
        
    );

        
    $server->run();
    apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

    Kommentar


    • #3
      composer dumpautoload -o

      Restaurant Bewertungsportal yumee.de

      Kommentar


      • #4
        das slash nach src habe ich eingebaut, doch leider geht es auch nicht.

        HTML-Code:
          "MyApp\": "src/"

        Dankeschön für den Hinweis zu prüfen ob der autoload.php vorhanden ist. Habe ich eingebaut. Soweit kommt er leider nicht. Vorher kommt die Meldung:
        Fatal error: Uncaught Error: Class 'Chat' not found in C:\wamp64\www\Uebersetzer\bin\chat-server.php:18


        inkamina welche Option könnte -o sein? Der Hintergrund: ich nutze den composer aus PHPStorm. Im PHPStorm terminal kann ich composer dumpautoload -o nicht ausführen. composer ist nicht bekannt. PHPStorm hat jedoch eine Möglichkeit Dump Autoloader auszuführen und danach kommt der Dialog im Bild.2019-04-02_184802.png

        2019-04-02_185427.png

        Kommentar


        • #5
          bin/src/vendor sind alle in Uebersetzer, also müsstest Du von src oder bin aus ../vendor/ machen nicht ./vendor

          Kommentar


          • #6
            Zitat von R1100 Beitrag anzeigen
            inkamina welche Option könnte -o sein? Der Hintergrund: ich nutze den composer aus PHPStorm. Im PHPStorm terminal kann ich composer dumpautoload -o nicht ausführen. composer ist nicht bekannt. PHPStorm hat jedoch eine Möglichkeit Dump Autoloader auszuführen und danach kommt der Dialog im Bild.
            Der Parameter -o steht für optimize, Äquivalent zu deiner zweiten Option. Hast du das mal getestet? Bei mir hat es bei ähnlichen Problemen Wunder gewirkt. Viel Erfolg!
            Restaurant Bewertungsportal yumee.de

            Kommentar


            • #7
              Zitat von R1100 Beitrag anzeigen
              das slash nach src habe ich eingebaut, doch leider geht es auch nicht.
              Nein es ist nicht nur der Slash am Ordner, alle Namespaces müssen mit einem Doppelten \\ getrennt werden also hinter MyApp auch noch ein \\ eintragen. und das was tomBuilder schrieb, du muss ein Ordner höher gehen um autoload.php zu inlucden
              apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

              Kommentar


              • #8
                oh sorry Leute mit den relativen Pfaden, die habe ich jetzt angepasst.

                Obwohl ich das nicht ganz verstanden habe. Ich dachte dirname(__DIR__) macht daraus einen Absoluten Pfad. Somit sollte dirname(__DIR__) .'/vendor/autoload.php' eigentlich stimmen. Aber egal.


                Ich bekomme jetzt die Fehlermeldung: PHP Fatal error: Uncaught Error: Class 'Chat' not found in /C:/wamp64/www/Uebersetzer/bin/chat-server.php on line 20

                So sieht jetzt das File chat-server.php aus.

                PHP-Code:
                <?php

                use Ratchet\Server\IoServer;
                use 
                Ratchet\Http\HttpServer;
                use 
                Ratchet\WebSocket\WsServer;
                use 
                Chat;


                if (!
                is_file('../vendor/autoload.php')) {
                    echo 
                "File wurde nicht gefunden: " '../vendor/autoload.php'//hier prüfen ob autoload.php da ist

                    
                die();
                }
                require 
                '../vendor/autoload.php';


                $server IoServer::factory(
                    new 
                Chat(),
                    
                80
                );

                $server->run();
                Die Klasse Chat in Chat.php habe ich nach dem Beispiel erweitert. Ich dachte möglicherweise hängt es damit zusammen, leider auch nicht. So siehe sie jetzt aus.
                PHP-Code:
                <?php

                //http://socketo.me/docs/hello-world

                namespace MyApp;
                use 
                Ratchet\MessageComponentInterface;
                use 
                Ratchet\ConnectionInterface;


                class 
                Chat implements MessageComponentInterface{
                    protected 
                $clients;

                    public function 
                __construct()
                    {
                        
                $this->clients = new \SplObjectStorage;
                    }

                    public function 
                onOpen(ConnectionInterface $conn)
                    {
                        
                // store the new connection to send messages to later
                        
                $this->clients->attach($conn);
                        echo 
                "New connection! ({$conn->resourceId})\n";

                    }

                    public function 
                onMessage(ConnectionInterface $from$msg)
                    {
                        
                $numRecv count($this->clients) - 1;
                        echo 
                sprintf('Connection %d sending message "%s" tp %d other connection%s' """
                        , 
                $from->resourceId$msg$numRecv == 1 ? '' : 's');

                        foreach (
                $this->clients as $client){
                            if (
                $from !== $client){
                                //The sender is not then receiver, send to each client connected
                                
                $client->send($msg);
                            }
                        }
                    }

                    public function onClose(ConnectionInterface 
                $conn)
                    { //The connection is closed, remove it, as we can no longer send it messages
                        
                $this->clients->detach($conn);
                        echo "
                Connection {conn->resourceIdhas disconneced\n";

                    }

                    public function onError(ConnectionInterface 
                $conn, \Exception $e)
                    {
                        echo "
                An error has occured: {$e->getMessage()}\n";
                        
                $conn->close();
                    }

                }




                Übrigens: optimize autoloader habe ich durchgeführt, leider ohne Erfolg, zumindest nicht für mich sichtbar.

                Kommentar


                • #9
                  __DIR__ ist ein absoluter Pfad.

                  Sollte das nicht
                  PHP-Code:
                  use MyApp\Chat
                  lauten?

                  Kommentar


                  • #10
                    MyApp\Chat; Ja perfekt, genau das ist es. Oh je, Im Beispiel ist es auch genau so. Asche über mein Haupt.

                    PHP-Code:
                    <?php

                    use Ratchet\Server\IoServer;
                    use 
                    Ratchet\Http\HttpServer;
                    use 
                    Ratchet\WebSocket\WsServer;
                    use 
                    MyApp\Chat;


                    if (!
                    is_file(dirname(__DIR__) .'/vendor/autoload.php')) {
                        echo 
                    "File wurde nicht gefunden: " dirname(__DIR__) .'/vendor/autoload.php'//hier prüfen ob autoload.php da ist

                        
                    die();
                    }
                    require 
                    dirname(__DIR__) .'/vendor/autoload.php';


                    $server IoServer::factory(
                        new 
                    Chat(),
                        
                    8080
                    );

                    $server->run();

                    Habe den Port noch auf 8080 abgeändert und schon funktioniert die Sache. Ist ja wie Weihnachten.

                    Kommentar

                    Lädt...
                    X