Ako pripajat triedy, aby som si ich mohol zavolat

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
drick
Člen | 61
+
0
-

Caute, neviem si rady s nasledovnou vecou, snad sa najde clovek, ktory mi bude vediet pomoct.

Mam subor – server.php v umiestneni /bin/. Mojim problemom je, ze si v nom neviem vytvorit instanciu v podstate na ziadnu triedu.
server.php:

<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;

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

$test = new \Chat\ws\Main();
$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new \Chat\ws\Main()
	)
    ),
    8080
);

$server->run();

Tento subor spustam cez konzolu a pokial to spustim tak ako je uvedene, dostavam error:

Fatal Error: Class \Chat\ws\Main() not found in ...

dostavam to tam kde si vytvaram instanciu $test. Rovnaky Error dostavam, nech si tam vytvorim instanciu akejkolvek triedy. Ak vsak tento riadok zakomentujem, tak server.php dokazem spustit bez chyby. Teda program pozna tu cast new \Chat\ws\Main() o 4 riadky nizsie.

Zahadou teda pre mna je preco dostavam error na tomto riadku: $test = new \Chat\ws\Main(); , ale nedostavam ho na tomto: new WsServer(new \Chat\ws\Main()).

Ja vsak potrebujem aj ten riadok kde je $test – potrebujem si tam vytvorit instanciu inej triedy.

Skusil som pridat riadok require (zakomentovany v priklade). Ak vsak tento riadok odkomentujem dostanem error Permission denied na tomto riadku.

Mojou otazkou teda je, ako si mozem do premennej $test dat instanciu nejakej triedy? Alebo ako povolit pristup require riadku? Moze to nejak blokovat .htaccess?

Takto vyzera strom suborov:
- app
	- ...
	- bootstrap.php
- bin
	- server.php
- log
- temp
- vendor
	- triedy, z ktorych si potrebujem spravit instanciu
- www

Mozno este bude treba subor bootstrap.php, ten vyzera takto:

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

$configurator = new Nette\Configurator;

//$configurator->setDebugMode('23.75.345.200'); // enable for your remote IP
$configurator->enableDebugger(__DIR__ . '/../log');

$configurator->setTempDirectory(__DIR__ . '/../temp');

$configurator->createRobotLoader()
        ->addDirectory(__DIR__)
        ->addDirectory(__DIR__ . '/../bin')
        ->addDirectory(__DIR__ . '/../vendor/others')
        ->register();

$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon');

$container = $configurator->createContainer();

return $container;

Dakujem.

Editoval drick (23. 4. 2016 16:46)

Michal Vyšinský
Člen | 608
+
+2
-

Ahoj, použij jen require __DIR__ . '/../vendor/autoload.php';

tím voláním dirname() se nakonec pokoušíš requirovat celou složku, což nelze.

drick
Člen | 61
+
0
-

Michal Vyšinský napsal(a):

Ahoj, použij jen require __DIR__ . '/../vendor/autoload.php';

tím voláním dirname() se nakonec pokoušíš requirovat celou složku, což nelze.

Vdaka, ale tu sa dostavam k druhemu Erroru. Teda vlastne k tomu, co som pisal prvy.

Ked chcem pripojit dalsiu triedu, dostavam error:

Fatal Error, class not found in

Konkretne chcem pripojit triedu Pusher. Nachadza sa v /vendor/others/Pusher.php (skusal som ju presunut aj do /bin/Pusher.php, ale bez zmeny). Nepomohol ani namespace. Teda, vyzera to tak isto, iba namiesto
$test = new \Chat\ws\Main();
tam davam
$test = new \Pusher;

Pusher je prazdny, vyzera iba takto:

<?php
//namespace Test; //nepomohlo
class Pusher {

}

Zaujimave je, ze v hociakom prezentery mi trieda Pusher ide volat bez Erroru. Volat mi teda nejde iba zo server.php

  • teraz ako pozeram, tak v server.php mi nejdu volat ziadne triedy z mojich priecinkov /bin a /vendor/others

Editoval drick (23. 4. 2016 17:11)

Unlink
Člen | 298
+
+2
-

Vyžiadaj si boostrap.php

$container = require __DIR__ . '/../app/bootstrap.php';

Ide to to, že tým require __DIR__ . '/../vendor/autoload.php'; sa ti načítajú len triedy, ktoré sú nainštalované pomocou composera. Nette na načítavanie svojích tried používa RobotLoader a ten najjednoduchšie získaš takto.

drick
Člen | 61
+
0
-

Unlink napsal(a):

Vyžiadaj si boostrap.php

$container = require __DIR__ . '/../app/bootstrap.php';

Ide to to, že tým require __DIR__ . '/../vendor/autoload.php'; sa ti načítajú len triedy, ktoré sú nainštalované pomocou composera. Nette na načítavanie svojích tried používa RobotLoader a ten najjednoduchšie získaš takto.

Super, toto je presne to, co som hladal. Dakujem.

Šaman
Člen | 2666
+
+2
-
  1. Bavíme se o Nette? Podle ukázky mi to připadá, že se jedná o nějaký tvůj script, který je úplně mimo Nette, tedy nezávisí na bootstrapu a nepracuje s RobotLoaderem. V tom případě si musíš requirnout přímo ty soubory, které potřebuješ, jako v čistém PHP (protože jsi v čistém PHP).
  2. Pokud si requirneš /vendor/autoload.php, tak máš k dispozici jen to, co je přidané composerem. Tedy ne věci ve vendor/others (composer o tom neví a v Nette by ti tyto třídy načetl RobotLoader, viz. jeho konfigurace v bootstrapu).
  3. To require dirname(__DIR__ . '/../vendor/autoload.php'); je úplný nesmysl, fce dirname ti vrátí název složky, ale ty chceš requirovat soubor. Ale jak jsem psal výše, ani správně zapsané by ti to nenačetlo třídy které jsi nepřidal composerem.
  4. Takže si ručně načti přímo třídy, které daný script potřebuje. S Nette presenterem to nesrovnávej, ten má automaticky načtené třídy RobotLoaderem, což ty zřejmě nemáš.