Registrace uživatele, nemůže najít Nette\Object

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

Zdarec, už dlouho bojuju s registrací uživatelů a nemůžu dojít kde mám chybu, dělal jsem to podle nějakého tutoriálu. Je tam nějaká drobnost, ale nemůžu přijít na to kde :-(. Laděnka hlásí chybu Class ‚App\Nette\Object‘ not found

Zde je můj model Users.php:

<?php
namespace App;

  abstract class Users extends Nette\Object
{
    /** @var Nette\Database\Context */
    private $database;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }


      public function register($data) {
    unset($data["password2"]);
    $data["name"] = "name";
    $data["username"] = "username";
    $data["email"] = "email";
    $data["password"] = sha1($data["password"]);


    $this->database->table('user')->insert($data);
}


}
?>

Můj RegisterPresenter:

<?php

namespace App\Presenters;

use Nette,
    App\Model,

    Nette\Application\UI,
    \Nette\Diagnostics\Debugger as Ndebug,
    Nette\Application\UI\Form as Form;


class RegisterPresenter extends BasePresenter {

    /**
* @var \App\Users
* @inject
*/
    public $users;


      /** @var Nette\Database\Context */
    private $database;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }



    protected function startup() {
        parent::startup();
        $this->users = $this->context->users;
    }

    public function renderRegister(){
    }


    protected function createComponentRegisterForm() {
        $form = new Form;
        $form->addText('name', 'Jméno');
        $form->addText('email', 'E-mail: *', 35)
                ->setEmptyValue('@')
                ->addRule(Form::FILLED, 'Vyplňte Váš email')
                ->addCondition(Form::FILLED)
                ->addRule(Form::EMAIL, 'Neplatná emailová adresa');
        $form->addPassword('password', 'Heslo: *', 20)
                ->setOption('description', 'Alespoň 6 znaků')
                ->addRule(Form::FILLED, 'Vyplňte Vaše heslo')
                ->addRule(Form::MIN_LENGTH, 'Heslo musí mít alespoň %d znaků.', 6);
        $form->addPassword('password2', 'Heslo znovu: *', 20)
                ->addConditionOn($form['password'], Form::VALID)
                ->addRule(Form::FILLED, 'Heslo znovu')
                ->addRule(Form::EQUAL, 'Hesla se neshodují.', $form['password']);
        $form->addSubmit('send', 'Registrovat');
        $form->onSuccess[] = callback($this, 'registerFormSubmitted');
        return $form;
    }

    public function registerFormSubmitted(UI\Form $form) {
        $values = $form->getValues();
        $this->users->register($values);

            $this->flashMessage('Registrace se zdařila, jo!');
            $this->redirect('Sign:in');
        }



}

a config neon:

#
# SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
#
# If you don't protect this directory from direct web access, anybody will be able to see your passwords.
# https://nette.org/en/security-warning
#
parameters:


php:
	date.timezone: Europe/Prague
	# zlib.output_compression: yes


nette:
	application:
		errorPresenter: Error
		mapping:
			*: App\*Module\Presenters\*Presenter

	session:
		expiration: 14 days


services:
	- App\RouterFactory
	router: @App\RouterFactory::createRouter
	authenticator:				Authenticator

za každou radu moc díky, už si nevím rady prostě..

Editoval Nevinho (3. 4. 2014 17:40)

Šaman
Člen | 2666
+
0
-

Jsi v namespace App a používáš relativní zápis. Dej tam extends \Nette\Object :)
Anebo, lépe, přidej Nette\Object do sekce use. A protože Object je příliš obecné, můžeš přidat alias.

<?php
namespace App;
use Nette\Object as NObject,
	Nette\Database\Context;

abstract class Users extends NObject
{
    /** @var Context */
    private $database;

    public function __construct(Context $database)
    {
        $this->database = $database;
    }
...
?>

Za sebe doporučuji používat všude buď sekci use, nebo absolutní zápis NS s lomítkem na začátku. Jediná výjimka je zatím anotace inject v presenteru, která vyžaduje absolutní zápis a neumí pracovat se sekcí use.

Editoval Šaman (3. 4. 2014 17:52)

voda
Člen | 561
+
0
-

Chybí ti tam lomítko

abstract class Users extends \Nette\Object {
}
Nevinho
Člen | 77
+
0
-

Ok, opravil jsem dle vašich rad, ovšem teď mi laděnka hlásí další chybu: Nette\DI\MissingServiceException

Service of type \App\Users not found. Tam bude problém asi s tím injektováním někde asi..

Jinak díky za radu.

Tomáš Votruba
Moderator | 1114
+
0
-

Zkus odstranit abstract z abstract class Users.

Nevinho
Člen | 77
+
0
-

Odstranil jsem abstract ale nepomohlo :-(, pořád stejná chyba od laděnky.

Díky za odpověď

Editoval Nevinho (3. 4. 2014 18:06)

Šaman
Člen | 2666
+
0
-

No, však v configu taky žádnou službu, která by vracela App\Users, nemáš. Nastuduj si nejprve trochu DI a systénový kontejner. Ve zkratce – všechny služby, které vytvářiš pomocí configu jsou k dispozici pro autowiring, tedy automatické předávání závislostí. Pokud nějaká služba bude mít závislost (ať už v konstruktoru, nebo inject metodu/property), tak autowiring se pokusí podle anotací tuto závislost najít a předat. Ale musí ji mít kde vzít. A hledá ji právě v kontejneru.

Takže řešení je přidat do configu, do services:

- App/Users

Pozn. Jen pro přesnost, inject metoda/property je podporovaná jen v Presenterech, jinde na ni nefunguje autowiring a měla by se proto nastavovat buď ručně, nebo, lépe, přesunout do konstruktoru.

Editoval Šaman (3. 4. 2014 18:12)

Nevinho
Člen | 77
+
0
-

Přidal jsem co configu – – App\Users

Bohužel ted mi to hlásí chybu: Nette\DI\MissingServiceException

Service ‚users‘ not found.

A řve to na

protected function startup() {
            parent::startup();
          ** $this->users = $this->context->users;**
      }

v RegistryPresenteru

David Matějka
Moderator | 6445
+
0
-

users injectujes pomoci

/**
* @var \App\Users
* @inject
*/
public $users;

to sahani na context ve startupu smaz

Mysteria
Člen | 797
+
0
-

Tohle vůbec nepotřebuješ

protected function startup() {
	parent::startup();
	$this->users = $this->context->users;
}

když máš tohle

/** @var \App\Users @inject */
public $users;
Šaman
Člen | 2666
+
0
-

Koukám, že to máš docela zabroučkovaný :)

My ti tu vždycky poradíme tu jen nejlépe viditelnou chybu, spoléháme na to, že jestli to máš třeba opsané ze Sandboxu, tak bys tam neměl mít tolik chyb. A sahání na kontext v Sandboxu není už pár let, určitě od dvojkové (2.0) verze. Takže doporučuji začít s aktuálním stabilním Nette, na Sandboxu který je přiložený v distribučním balíku a když ti něco nebude fungovat, tak se ptej.

Jestli jsi to sahání na kontext opsal v nějakém starém vlákně na fóru, tak věz, že hledání je fajn, ale bohu(žel|dík) se Nette tak hekticky vyvíjelo, že vlákna starší dvou let (ale v některých případech i jen několik měsíců) jsou zastaralá.

Editoval Šaman (3. 4. 2014 19:12)

Nevinho
Člen | 77
+
0
-

Jj jak říká Šaman, už to vše funguje je to ale hrůza, člověk něco dělá pak se k tomu za půl roku vrátí a všechno se dělá jinak :-D. Díky už to funguje :-)

tinkess
Člen | 1
+
0
-

Nevinho napsal(a):

Jj jak říká Šaman, už to vše funguje je to ale hrůza, člověk něco dělá pak se k tomu za půl roku vrátí a všechno se dělá jinak :-D. Díky už to funguje :-)

Prosím ťa a nemohol by si tu hodiť, ako si to dal dokopy? Lebo mám presne ten istý problém ale neviem si s tým nijak poradiť :(