Ako na pouzitie vlastnej triedy
- Lubtor
- Člen | 7
Dobrý den,
som úplný začiatočník a potrebujem Vašu pomoc.
Chcem si vytvoriť vlastnú testovaciu triedu, ktorú potom použiem
v HomepagePresenter, no neviem ako na to. Vytvoril som si v app/model/ triedu
MenuManager
<?php
namespace App\Model;
use Nette;
/**
* Menu management.
*/
class MenuManager extends Nette\Object
{
/** @var Nette\Database\Context */
private $database;
private $data;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
/**
* @param string
* @return void
*/
public function setData($data){
$this->data = $data;
}
}
Tu je moj HomepagePresenter
<?php
namespace App\Presenters;
use Nette;
use App\Model;
class HomepagePresenter extends BasePresenter
{
/** @var Nette\Database\Context */
private $database;
/**
* @inject
* @var \App\Model\MenuManager
*/
private $menuManager;
public $userManager;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderDefault()
{
$this->menuManager->setData("test");
$this->template->menu = $this->database->table('menu');
$this->template->posts = $this->database->table('posts')
->order('created_at DESC')
->limit(5);
}
}
No po spusteni mi hadze chybu Call to a member function setData() on
a non-object
Neviem co s tym, prosim berte ohlady, som zaciatocnik :)
Dakujem
- Lubtor
- Člen | 7
Ano mam
#
# WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
# https://nette.org/en/security-warning
#
parameters:
php:
date.timezone: Europe/Prague
application:
errorPresenter: Error
mapping:
*: App\*Module\Presenters\*Presenter
session:
expiration: 14 days
services:
- App\Model\UserManager
- App\Model\MenuManager
- App\Forms\SignFormFactory
router: App\RouterFactory::createRouter
- GEpic
- Člen | 566
Ahoj,
jen info, db context můžeš také @injectovat a tím dát pryč kontrustor
/** @var Nette\Database\Context @inject */
public $database;
A dále, v HomepagePresenteru máš use App\Model;
takže by
mělo stačit použít jméno třídy. Jo a, inject proměnné musí
být PUBLIC
/** @var MenuManager @inject */
public $menuManager;
Používáš nějaké IDE? Řeší tyhle věci za tebe, a jako začátečníkovi ti to pomůže odhalit spousty chyb.
Editoval GEpic (17. 2. 2016 22:16)
- GEpic
- Člen | 566
Lubtor napsal(a):
Dal som ju public a funguje :) Diky moc, stravil som nad tym asi 2 hodiny.
- este jedna vec:
daju sa nejako dinamicky v presentery vytvarat instanicie triedy?
nieco ako v JAVE premenna1 = new MenuManager(); premenna2 = new MenuManager() ?
Jasně že dá, jde ale o to v jakém případě to chceš použít.
Služby nemá smysl vytvářet tímto způsobem, stačí je injectnout
v BasePresenteru a pak jí můžeš používat ve všech presenterech, které
dědí BasePresenter (přístup např takto –
$this->menuManager
). A navíc, pokud vytváříš instanci
třídy, která nemá konstruktor nebo žádný parametr, můžeš použít:
$animal = new Dog; // Vytvoří instanci třídy Dog, ale můžeš použít i závorky
$animal = new Animal('dog'); // Nebo klasicky jak znáš z Javy
Editoval GEpic (17. 2. 2016 22:23)