Ako pripajat triedy, aby som si ich mohol zavolat
- drick
- Člen | 61
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
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
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
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
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
- 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).
- Pokud si requirneš
/vendor/autoload.php
, tak máš k dispozici jen to, co je přidané composerem. Tedy ne věci vevendor/others
(composer o tom neví a v Nette by ti tyto třídy načetl RobotLoader, viz. jeho konfigurace v bootstrapu). - 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. - 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áš.