dibi inject do dynamicky načteného modelu pomocí addservice

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

Ahoj všem,
prosím nevíte někdo, jak napojit Dibi do dynamicky vytvořeného modelu?

V basepresenteru přidávám služby pomocí

	$pluginServices = $this->updates->getClassType('model');
foreach($pluginServices as $services) {
		$class = $services->class;
		$this->context->addService($services->class, new $class());
	}

v náhodné dynamicky načtené komponentě přidám dynamicky načtenou službu

namespace App\Components;

use Nette\Application\UI;

class plugin_itemCover_admin extends UI\Control {

    private $module;
    private $id;
    public function __construct($id) {
        $this->id       = $id;
    }

    public function render() {
        $this->template->setFile(__DIR__ . '/plugin_itemCover_admin.latte');
        $this->template->title = "První modul";

		//přidání načtené služby
        $this->module = $this->presenter->context->getService('module_item_cover');

		// volání funkce ze služby | funkce se zavolá
        $this->module->addCover($this->id,"Zkouška");

        $this->template->render();
    }
}

Dynamicky načtená služba, která má obsluhovat dynamicky načtenou komponentu
bohužel nevím, jak načíst dibi s určitou konfigurací, bez toho aniž bych musel manuálně zaregistrovat službu do config

class module_item_cover extends \Nette\Object {

    /** @var DibiConnection @inject */
    private $db;

    private $t_module_item_cover = "module_item_cover";

    public function __construct(\DibiConnection $db) {
        $this->db = $db;
    }

    //*********************
	// Funkce se zavolá ale $this->db je nulové
    public function addCover($cover_id, $title, $description = null, $hyperlink = null) {
        return $this->db->insert($this->t_module_item_cover, array(
            "cover_id"      => $cover_id,
            "title"         => $title,
            "description"   => $description,
            "hyperlink"     => $hyperlink,
            "createtime"    => new DateTime()
            ))->execute(dibi::IDENTIFIER);
    }

Moc děkuji za radu, začínám mít pocit, že si dělám velkou díru do aplikace. Budu rád za jakékoliv nakopnutí i radu, jak přiřadit zaregistrovat externí baličky (služby, komponenty) do aplikace, jen z přístupu admina a se zvláštním oprávněním databáze.

Už nějaký pátek jsem seknutý na tomto problému, moc mi jakoukoliv diskuzí pomůžete.
Děkuji

David Matějka
Moderator | 6445
+
0
-

Proc ty sluzby potrebujes nacitat dynamicky?

Opravdu potrebujes instalovat externi balicky z administrace? To by se odnekud stahovaly/nahravaly? myslim, ze si zbytecne komplikujes zivot :)

Jiří Nápravník
Člen | 710
+
+1
-
  1. neni uplne pekne delat dalsi dotaz, kdyz uz jsi ho pridaval jen jinak formuloval.
  2. vykasli se na pridavani sluzeb v presenteru. pokud tech balicku bude hodne, tak to pri kazdem requestu bude ty sluzby pridavat a muze to byt celkem vykonostni problem. Zkratka bych to resil pres compiler extension, v kazdem balicku, ktera prida potrebne sluzby do kontejneru. Pokud to chces pridavat primo z amdinsitraci, tak bych jeste pridal po pridani balicku, at to smaze DIC kontejner z tempu, aby se nacetl novy s temi potrebnymi sluzbami. A pak to budes standardne pouzivat jako jindy…
Wailey
Člen | 48
+
0
-

David Matějka napsal(a):

Proc ty sluzby potrebujes nacitat dynamicky?

Opravdu potrebujes instalovat externi balicky z administrace? To by se odnekud stahovaly/nahravaly? myslim, ze si zbytecne komplikujes zivot :)

Má to svůj důvod si jej komplikovat.. :)

Přesně tak, jde mi o vytvoření balíčků, které se stáhnou a automaticky se do aplikace nainstalují. Některé služby nepokrývají všechny potřeby nových komponent a proto je potřebuji dynamicky zaindexovat do DI a cache, komponenty a modely se zkopírují|přepíšou do předem daných složek a uloží se jejich informace do databáze, kvůli přepisování a kontrole verzí. K pozdějšímu použití a zakomponování v editaci.

Právě hledám způsob, jak zajistit tuto funkci v aplikaci pomocí DI. Bez toho, abych si tam udělal díru a násilně cpal dibi do modelů.. avšak stále bádám a hledám nové způsoby. A bohužel jsem se na tom neskutečně sekl, a musím to co nejdříve vyřešit ..

Jiří Nápravník napsal(a):

1. neni uplne pekne delat dalsi dotaz, kdyz uz jsi ho pridaval jen jinak formuloval.

za naléhání se omlouvám,..
Je to akutní, a musím to nějak vyřešit tuto funkci aplikace.. :(

2. vykasli se na pridavani sluzeb v presenteru. pokud tech balicku bude hodne, tak to pri kazdem requestu bude ty sluzby pridavat a muze to byt celkem vykonostni problem. Zkratka bych to resil pres compiler extension, v kazdem balicku, ktera prida potrebne sluzby do kontejneru. Pokud to chces pridavat primo z amdinsitraci, tak bych jeste pridal po pridani balicku, at to smaze DIC kontejner z tempu, aby se nacetl novy s temi potrebnymi sluzbami. A pak to budes standardne pouzivat jako jindy…

Souhlasím se spomalením, když jej budu pokaždé načítat. Nerozumím jak to myslíš s tím Compiler Extension, jak to udělat tak, abych vytáhl určité služby z databáze, nainstaloval je a jen resetoval cache.

Přemýšlel jsem, že by ‚něco‘, mohlo jen zkontrolovat načtené služby a případně by je přidal a resetoval cache. Ale nevím, jak na to :/

A tak předem děkuji za jakýkoliv názor a pomoc. :)

Jiří Nápravník
Člen | 710
+
0
-

Nevim uplne jak to mas, ale pokud mas ty sluzby v databazi, tak ja bych si udelal CompilerExtension, ktera se podiva do databaze, vytahne vsechny ty sluzby a zaregistruje. Tim padem se se tohle provede jenom pri sestaveni DI kontejneru a pak uz to je v podstate nacachovane a uz te to nemusi zajimat. Problem bude asi jeden, ze v dobe sestavovani kontejneru nebudes mit pravdepodobne sluzbu pro pripojeni do databaze, tak se tam budes muset nejak prasacky nahackovat, aby ses do te databaze dostal.

A jak nainstalujes novy balicek, tak bych udelal, ze se promazne temp folder, a tim se znovu spustit ta CompilerExtension a sestavi novy kontejner uz s novymi sluzbami.

Wailey
Člen | 48
+
0
-

Jiří Nápravník napsal(a):

Nevim uplne jak to mas, ale pokud mas ty sluzby v databazi, tak ja bych si udelal CompilerExtension, ktera se podiva do databaze, vytahne vsechny ty sluzby a zaregistruje. Tim padem se se tohle provede jenom pri sestaveni DI kontejneru a pak uz to je v podstate nacachovane a uz te to nemusi zajimat. Problem bude asi jeden, ze v dobe sestavovani kontejneru nebudes mit pravdepodobne sluzbu pro pripojeni do databaze, tak se tam budes muset nejak prasacky nahackovat, aby ses do te databaze dostal.

A jak nainstalujes novy balicek, tak bych udelal, ze se promazne temp folder, a tim se znovu spustit ta CompilerExtension a sestavi novy kontejner uz s novymi sluzbami.

Dá se nějak editovat config.neon v basepresenteru?
Napadla mě kontrola „poslední provedená aktualizace“ z databáze, pokud nebyla zkotroluje a pozmění config, vymaže cache a restartuje aplikaci, která se načte z nového configu.

Avšak, jak zkontroluji a z edituji (exist|add|del) služby v config z presenteru?

Děkuji

Jiří Nápravník
Člen | 710
+
0
-

Na co editovat config.neon? Hlavně tyhle věci by v presenteru neměli nic dělat, to je zbytečný čas při každém requestu.

Já prostě myslel mazat cache, když se nainstaluje nebo aktualuzije. Zkratka provede se aktualizace, smaze cache a sestavi se novy kontejner.

Nevím co si predstavit pod sluzbami exist|add atd. Proste pokud je noe pridana sluzba, tak se prida. Nemusis to pridavat pres config, neni ani asi uplne idealni, pridaval bych je v te CompilerExtension

akadlec
Člen | 1326
+
0
-

IMHO se to snažíš řešit moc komplikovaně a zbytečně si stěžuješ práci :D

Toto řeším taky, potřebuji abych v appce mohl dynamicky zapínat a vypínat moduly, připadně je instalovat apod. Řešení je jednoduché, všechny moduly jsou jako ext a to zda se naloadují záleží na NEON configu který edituji pak už přes admin. Pak jak píše Jiří, stačí mazat cache.

Wailey
Člen | 48
+
0
-

akadlec napsal(a):

IMHO se to snažíš řešit moc komplikovaně a zbytečně si stěžuješ práci :D

Toto řeším taky, potřebuji abych v appce mohl dynamicky zapínat a vypínat moduly, připadně je instalovat apod. Řešení je jednoduché, všechny moduly jsou jako ext a to zda se naloadují záleží na NEON configu který edituji pak už přes admin. Pak jak píše Jiří, stačí mazat cache.

Existují nějaké funkce na načtení a editaci souborů neon? právě mě toto smýšlení teže už napadlo, že po instalaci nějakého modulu, se automaticky přepíše například plugin.neon vymaže se cache a restartuje app. Ale nevím, jak editovat neon, prozatím jinak než pracácky textově přepis souboru :D

Pavel Macháň
Člen | 282
+
0
-

Wailey napsal(a):

akadlec napsal(a):

IMHO se to snažíš řešit moc komplikovaně a zbytečně si stěžuješ práci :D

Toto řeším taky, potřebuji abych v appce mohl dynamicky zapínat a vypínat moduly, připadně je instalovat apod. Řešení je jednoduché, všechny moduly jsou jako ext a to zda se naloadují záleží na NEON configu který edituji pak už přes admin. Pak jak píše Jiří, stačí mazat cache.

Existují nějaké funkce na načtení a editaci souborů neon? právě mě toto smýšlení teže už napadlo, že po instalaci nějakého modulu, se automaticky přepíše například plugin.neon vymaže se cache a restartuje app. Ale nevím, jak editovat neon, prozatím jinak než pracácky textově přepis souboru :D

Neon má encode ale i decode, takže si ten config můžeš načíst jako pole, to upravit a zase přetvořit na neon a uložit.

Wailey
Člen | 48
+
0
-

Pavel Macháň napsal(a):
Neon má encode ale i decode, takže si ten config můžeš načíst jako pole, to upravit a zase přetvořit na neon a uložit.

Perfektní, udělám pár předělávek a bude to fungovat.

Moc děkuji všem za rady a správné nasměrování :)

Wailey
Člen | 48
+
0
-

Napsal jsem pomocnou knihovnu pro editaci služeb, tak se s vámi chci o ni podělit. Snad vám bude k něčemu užitečná

Příklad použití

	//	Otevření souboru neon
	$plugins = new \editServiceNeon(__APP__ . '/config/services.neon');

	// Přidání
$plugins->add("Sluzba", "\\ClassSluzba", array("@dibi.connection"));
$plugins->add("Sluzba2", "\\ClassSluzba2", array("@dibi.connection"));

	// Přepsání
$plugins->set("Sluzba", "\\ClassSluzba", array("@dibi.connection", "@session"));

	// Uložení do otevřeného soubouboru
	$plugins->save();

	// Přepsat, či vytvořit jiný
$plugins->save(__APP__ . '/config/services2.neon');

	//Případně dumpnout dokodovaný array
dump($plugins->get());

Výstup services.neon

services:
	Sluzba:
		class: \ClassSluzba(@dibi.connection, @session)
	Sluzba2:
		class: \ClassSluzba2(@dibi.connection)

knihovna editServiceNeon.php

class editServiceNeon {
    private $handler;
    private $path;

    public function __construct($path) {
        if (!isset($path)) return null;

        $neon = new Nette\Neon\Neon();
        if (!file_exists($path)) {
            $f = fopen($path, "a");
            fclose($f);
        }

        $this->path     = $path;
        $this->handler  = $neon->decode(file_get_contents($path));
    }

    /*
     * @function get()
     */

    public function get() {
        return $this->handler;
    }

    /*
     * @function add
     * @param $name
     * @param $class
     * @param $attributes
     */

    public function add($name, $class = null, $attributes = null) {
        return ($this->isExists($name))?
            null:$this->set($name, $class, $attributes);
    }

    /*
     * @function set
     * @param $name
     * @param $class
     * @param $attributes
     */

    public function set($name, $class = null, $attributes = null) {
        if (isset($name)) {
            $this->handler['services'][$name]['Class'] =
                new Nette\Neon\Entity(
                    ($class)?$class:"\\$name",
                    $attributes
                );
        }
    }

    /*
     * @function isExists
     * @param $name
     */

    public function isExists($name) {
        return (isset($this->handler['services']))?
            array_key_exists($name,$this->handler['services']):null;
    }

    /*
     * @function save
     * @param $path
     */

    public function save($path = null) {
        $path = (isset($path))?$path:$this->path;
        if (file_exists($path)) {
            unlink($path);
        }

        $f = fopen($path, "a");
        $neon = new Nette\Neon\Neon();
        fwrite($f, $neon->encode($this->handler, 1));
        fclose($f);
    }
}

Editoval Wailey (7. 4. 2016 16:58)