Registrace uživatele, nemůže najít Nette\Object
- Nevinho
- Člen | 77
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
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)
- Šaman
- Člen | 2666
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)
- David Matějka
- Moderator | 6445
users injectujes pomoci
/**
* @var \App\Users
* @inject
*/
public $users;
to sahani na context ve startupu smaz
- Šaman
- Člen | 2666
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)
- tinkess
- Člen | 1
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ť :(