Ako na pouzitie vlastnej triedy

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

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

Leaf
Člen | 2
+
0
-

Máš MenuManager zaregistrovaný jako službu v configu? Pokud ne, tak do config.neon přidej:

services:
	-  App\Model\MenuManager

Editoval Leaf (17. 2. 2016 22:09)

Lubtor
Člen | 7
+
0
-

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
+
+2
-

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)

Lubtor
Člen | 7
+
0
-

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() ?

GEpic
Člen | 566
+
+2
-

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)

newPOPE
Člen | 648
+
+2
-

@Lubtor ano da presne tak ako to pises v Jave (nemusia tam byt ()) pokial nechces predavat parametre. Ci to pouzit ale je otazne, zalezi od toho co presne potrebujes.

Lubtor
Člen | 7
+
0
-

Super, funguje.
Dakujem moc a prajem pekny vecer

CZechBoY
Člen | 3608
+
0
-

Doporucuju plugin Nette helpers, pokud mas PhpStorm.
Tam je inspekce na inject, aby byla promenna public.