dibi inject do dynamicky načteného modelu pomocí addservice
- Wailey
- Člen | 48
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
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
- neni uplne pekne delat dalsi dotaz, kdyz uz jsi ho pridaval jen jinak formuloval.
- 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
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
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
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
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
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
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
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
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)