Volání metody třídy z app/model z www/classes/Trida.php

scientific
Člen | 93
+
0
-

Ahoj všem,

prosím si jako začátečník o radu, jak bych mohl volat třídu která je v app/models/Trida.php od někud jinud např. z www/podpurnaAplikacce/JinaTrida.php? Je to pro mě nejjednodušší cesta, jen nevím jak na to. Mé pokusy stylem pokus omyl nebyly úspěšné.

Mám tu podpůrnou aplikacci vlastně takto bokem, přestože samotná aplikace má vlastní vendor a sama si volá require_once(‚../../vendor/autoload.php‘); Je to tak už od vývojáře, ale tracy mi v té aplikaci stejně nenačítá.

Jak by se to dělalo správně? Toto je otázka jen tak na okraj, abych věděl pro příště.

Děkuji všem za radu.

Editoval scientific (6. 4. 2020 19:51)

Lukes
Silver Partner | 68
+
-2
-

Editoval Lukes (6. 4. 2020 22:59)

Kamil Valenta
Člen | 762
+
+2
-

Lukes napsal(a):
jednoduše stačí službu zaregistrovat do kontejneru a vyžádat si ji v konstruktoru

On to ale nemá jako třídu ve své app, ale jako službu z jiné app.

Já bych takhle do útrob jiné aplikace nesahal.

  • buď by ta jiná app měla mít nějaké API, které budeš volat
  • nebo ta fičura existuje ve formě samostatného balíčku a ty si ji regulérně dáš do vendor
  • nebo si, inspirován tou třídou, uděláš ve své app vlastní třídu v modelu

Cokoliv jiného se mi zdá hodně neudržitelné, třída se v „podpurneAplikaci“ může změnit a pokud na ni budeš sahat jen tak z venčí, padne to.

Lukes
Silver Partner | 68
+
0
-

Máš pravdu (toho jsem si nevšiml), to je pak spíše lepší vyčlenit kód do nějakého sdíleného balíčku přes composer…

scientific
Člen | 93
+
0
-

Ta jiná aplikace má nějaké API, které komunikuje s aplikací třetí strany. V projektu ji mám jako vendor (zapsanou v composeru) + ve www jako formulář a další věci.

Co potřebuji jsem sdělil, co mi odpovídáte nechápu.

Mám prostě v app něco co chci zavolat jednoduše zvenčí z hotové aplikace, tak abych tu aplikaci nemusel pro mě trnitou cestou předělávat do app/model, app/presenter, app/template a kdoví o ještě.

I když já jsem původně uvedl špatný příklad, já nepotřebuji mít ve www/podpurnaAplikae/ žádnou třídu, spíš php skript, který v reakci na něco potřebuje spustit nějakou funkci (metodu) tříddy z app/model/

Prosím nezapomínejte, že sem začátečník a je třeba na mě polopatě.

Editoval scientific (7. 4. 2020 10:18)

scientific
Člen | 93
+
0
-

Představuji si to nějak takto:

Jde jen o to, že takto nechápu jak to funguje a vlastně mi to takto funguje na jedno webu, na druhém už ne, tak bych potřeboval obecnou kuchařku, jak by se to dalo udělat a na o si dát pozor.

Jinak: Chci custom skriptu dát iluzi jakože je součástí app/ a umožnit mu volat metody (funkce) tříd z app/model.

www/custom.php:

//require_once(dirname(__FILE__)."/../app/bootstrap.php"); // toto musí být zakomentované, jinak mi to píše chybovku ohledne session, předpokládám, že je to tím, že už to mám nějak spuštěné.
$config = new Nette\Configurator;
$config->addConfig(__DIR__."/../app/config/config.local.neon");
$config->addConfig(__DIR__."/../app/config/config.neon");
$config->setTempDirectory(__DIR__ . "/../temp");
$cont = $config->createContainer();  // zde to píš chybu na druhém webu něcco o routerfatory, nejaký nesmysl, nevěřím, že tohle je správná cesta ta tak neposílám ani chybovou hlášku.
$database = $cont->getService("database");
$user = new App\Model\User($database, 0);

// Od teď mohu volat metody (funkce) třídy app/model/User.php
$user->UserAdd($jmeno);

Editoval scientific (7. 4. 2020 10:04)

CZechBoY
Člen | 3608
+
0
-

To máš nějaký cron nebo co to je za skript? Čím víc informací nám dáš, tím přesnější a užitečnější může být informace od rádců.

scientific
Člen | 93
+
+1
-

Jak s tím souvisí CRON? Je to prostě libovolný skript, jestli bude spouštěný manuálně nebo cron démonem přece nehraje už roli. Alespoň doufám. Konkrétní informace jsem nesdělil cíleně, abych věděl jak na to OBECNĚ.

Pokud si problém ale lépe vybavíte na příkladu, tak se jedná o integraci Braintree do e-shopu kamaráda.

Editoval scientific (7. 4. 2020 13:22)

David Matějka
Moderator | 6445
+
+2
-

ahoj, mužeš mrknout na článek na blogu, který teda ukazuje použití v CLI, ale bude to prakticky stejný i pro další scripty.

ale v tvém případě bude lepší integrovat to Braintree do nette aplikace

scientific
Člen | 93
+
0
-

Děkuji ti za článek, nicméně článek je úplně něco jiného než potřebuji. Ve článku se učí spouštět ručně skript z konzole bez ohledu na to co je v něm. Já Potřebuji ze skriptu volat funkci z app/model/Trida.php například ze SOAP api třídy. Aby si to API nebo gataway mohla spustit funkci např. na odeslání faktury klientovi, který uhradil platbu kartou.

ale v tvém případě bude lepší integrovat to Braintree do nette aplikace

Tomu nerozumím, jak jako do nette? Pokud myslíš do projektu, tak ano, psal jsem, že mám braintree normálně v ccomposer a vendor.

Zdá se, že neumím dostatečně napsat, s čím potřebuji poradit. Zkusím se trochu zopakovat a snad se vyjádřit lépe.

Tak tedy konkrétněji a lépe:

  • Přidal jsem si do composeru braintree a nainstaloval vendor.
  • Toto https://github.com/…/public_html jsem nahrál do webové části www/braintree.
  • Teď potřebuji z toho skriptu transactions.php zavolat ze třídy app/model/SpravaObjednavek.php metody jako:
echo "Vaše platba kartou byla platební bránou potvrzena. Děkujeme za nákup";
$objednavka = new App\Model\Objednavka;
$objednavka->uhrazeno(orderId, $transactionId);
$objednavka->posliFakturu(orderId, $clientId);
$objednavka->aktualizujSklad(orderId, $produtId, $mnozstvi);
//nevim co ještě

Editoval scientific (7. 4. 2020 14:15)

MajklNajt
Člen | 471
+
0
-

scientific napsal(a):

Děkuji ti za článek, nicméně článek je úplně něco jiného než potřebuji. Ve článku se učí spouštět ručně skript z konzole bez ohledu na to co je v něm. Já Potřebuji ze skriptu volat funkci z app/model/Trida.php například ze SOAP api třídy. Aby si to API nebo gataway mohla spustit funkci např. na odeslání faktury klientovi, který uhradil platbu kartou.

ale v tvém případě bude lepší integrovat to Braintree do nette aplikace

Tomu nerozumím, jak jako do nette? Pokud myslíš do projektu, tak ano, psal jsem, že mám braintree normálně v ccomposer a vendor.

Zdá se, že neumím dostatečně napsat, s čím potřebuji poradit. Zkusím se trochu zopakovat a snad se vyjádřit lépe.

Tak tedy konkrétněji a lépe:

  • Přidal jsem si do composeru braintree a nainstaloval vendor.
  • Toto https://github.com/…/public_html jsem nahrál do webové části www/braintree.
  • Teď potřebuji z toho skriptu transactions.php zavolat ze třídy app/model/SpravaObjednavek.php metody jako:
echo "Vaše platba kartou byla platební bránou potvrzena. Děkujeme za nákup";
$objednavka = new App\Model\Objednavka;
$objednavka->uhrazeno(orderId, $transactionId);
$objednavka->posliFakturu(orderId, $clientId);
$objednavka->aktualizujSklad(orderId, $produtId, $mnozstvi);
//nevim co ještě

Dávid ti odpovedal presne na to, na čo si sa pýtal, len treba poriadne čítať, nájdeš tam, ako si vytiahnuť službu z kontanjneru

David Matějka
Moderator | 6445
+
0
-

Toto https://github.com/…/public_html jsem nahrál do webové části www/braintree.

ten repozitar se nejmenuje „example“ jen tak nahodou :) slouzi to pro inspiraci, jak by se to pouzilo samostatne. ale v tvem pripade bude lepsi, kdyz to transformujes na presenter

scientific
Člen | 93
+
0
-

Až budu tak velký a zkušený programátor jako jste vy, jistě si všechno budu přepisovat do presenterů. Když sem ale ještě malé ptáčátko, co by mělo všechno takto přepisovat, nedělal bych nic jiného a tratil strašně hodně času.

Chci se to naučit, ale nyní jsem ve fázi, kdy chci mít radost z toho, že se mi povedlo to dát do kupy aby to fungovalo mojí cestou a potom teprve čase, až budu lépe chápat presentery začít svoje věcci psát jako presentery a teprve až potom si troufnu přepisovat cizí aplikace do prezenteru.

Už to v návodu od Davida sice vidím, ale moudrej z toho nejsem, když vím, že to má jít pořešit pár řádky odkudkoliv bez úprav třídy Bootstrap nebo co to tam autor článku dělá.

Ten kámoš tu má už jiné platební metody a žádný z nich nejsou jako presenter, ani cestou jako je v článku. Ale ani tak z těch ostatních dvou platebních bran nevidím cestu, jak to udělat stejně. :-D

Chtěl byh to zbastlit stejně jednoduše, aniž bych nějak sahal do nette.

Jedna platební brána je řešena takto /www/brana1/soap/pay.php:

...
require_once(dirname(__FILE__)."/../../../app/bootstrap.php");
...
/** @var App\Model\ClientManager */
    private $clientManager;
...
function __construct() {
        $user_id = 0;
        if (isset($_SESSION["user_id"])) $user_id = intval($_SESSION["user_id"]);
        $this->clientManager = new App\Model\ClientManager($user_id);
}
...

Druhá platební brána je řešena takto /www/brana2/gatevay.php:

...
require_once(dirname(__FILE__)."/../app/bootstrap.php");
$config = new Nette\Configurator;
$config->addConfig(__DIR__."/../app/config/config.local.neon");
$config->addConfig(__DIR__."/../app/config/config.neon");
$config->setTempDirectory(__DIR__ . "/../temp");
$cont = $config->createContainer();
$database = $cont->getService("database");
$user = new App\Model\User($database, 0);
...
$result = $user->UserAdd($username, $password, $email);
...

Já mám třetí platební bránu /www/brana3/transactions.php

session_start();
require_once('../../vendor/autoload.php');
// když po vzoru výše uvedených bran přidám require bootstrap, tak mi tracy failuje. Něcco ohledně session.

A zkouším pokus omyl co dál. :-D Abych mohl zavolat také třeba tu funkci $user->UserAdd($username, $password, $email);

Nevíte prosím někdo jak to zařídit touto cestou, namísto, abych si dělal nějaké forky v Nette?

Děkuji Vám moc, že se mi snažíte pomoci.

Editoval scientific (7. 4. 2020 15:39)

David Matějka
Moderator | 6445
+
+1
-

Něcco ohledně session.

predpokladam ze session is already started? zkus smazat to session_start


ale opravdu si to zkus napsat v presenteru, opravdu to nebude tak slozity :)

Kamil Valenta
Člen | 762
+
0
-

Já stále nechápu, proč by nějaká třída z vendoru měla volat něco v Tvojí aplikaci. Tohle přece funguje přesně naopak.

Ty máš u sebe model pro objednávku.

$objednavka = new App\Model\Objednavka($orderId);

V něm zavoláš z vednoru metodu na realizaci platby a ona Ti vrátí nějaký stav.

$transactionId = App\NejakyVendor\Platby::zaplat()
$objednavka->uhrazeno($transactionId);

A stále pokračuješ ve svém modelu…

$objednavka->posliFakturu($clientId);
$objednavka->aktualizujSklad($produtId, $mnozstvi);

Není důvod zasahovat do vendoru a volat z něj něco ve Tvém modelu. Narazilo by to i ve chvíli, kdy by třeba více projektů sdílelo jeden vendor (asi méně časté, ale stát se může).