Nette a doctrine uprava UserManager.php pridani uzivatele
- jarda256
- Člen | 130
Ahoj jsem začátečník co se týká nette. Snažím se zprovoznit spojení nette a doctrine. Mám entitu User a snažím se aby se v usermanager.php pomocí entity manageru vytvořil v db nový uživatel. Koukal sem na dokumentaci základů doctrine, ale i když mi to přijde správně tak výslekem je „Call to a member function persist() on null“. Díky všem za rady.
<?php
namespace App\Model\Entities;
use Doctrine\ORM\Mapping as ORM;
use Kdyby\Doctrine\Entities;
use Nette\Security\Passwords;
/**
* @ORM\Entity
* @ORM\Table(name="users")
*/
class User
{
use Entities\Attributes\Identifier;
use Entities\MagicAccessors;
/**@ORM\Column(type="string", length=32, nullable=false, unique=true)*/
private $login;
/**
* @ORM\Column(type="string")
*/
protected $password;
/**
* @ORM\Column(type="string", length=333, nullable=false)
*/
protected $email;
/**
* @ORM\Column(type="string", length=32, nullable=false)
*/
protected $telephone;
/**
* @ORM\Column(type="string", length=20, nullable=false)
*/
protected $role;
/**
* @var array roleList
*/
}
<?php
namespace App\Model;
use App\Model\Entities\User;
use Doctrine\ORM\EntityManager;
use Nette;
use Nette\Security\Passwords;
/**
* Users management.
*/
class UserManager implements Nette\Security\IAuthenticator
{
use Nette\SmartObject;
/** @var EntityManager @inject */
public $em;
const
TABLE_NAME = 'leader',
COLUMN_ID = 'id',
COLUMN_NAME = 'login',
COLUMN_PASSWORD_HASH = 'password',
COLUMN_EMAIL = 'mail',
COLUMN_TELEPHONE = 'telephone',
COLUMN_TEAMNAME = 'teamname',
COLUMN_TEAMNAMESHORT = 'teamnameshort',
COLUMN_COUNTRY = 'country',
COLUMN_ROLE = 'role';
/** @var Nette\Database\Context */
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
/**
* Performs an authentication.
* @return Nette\Security\Identity
* @throws Nette\Security\AuthenticationException
*/
public function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$row = $this->database->table(self::TABLE_NAME)->where(self::COLUMN_NAME, $username)->fetch();
if (!$row) {
throw new Nette\Security\AuthenticationException('The username is incorrect.', self::IDENTITY_NOT_FOUND);
} elseif (!Passwords::verify($password, $row[self::COLUMN_PASSWORD_HASH])) {
throw new Nette\Security\AuthenticationException('The password is incorrect.', self::INVALID_CREDENTIAL);
} elseif (Passwords::needsRehash($row[self::COLUMN_PASSWORD_HASH])) {
$row->update([
self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
]);
}
$arr = $row->toArray();
unset($arr[self::COLUMN_PASSWORD_HASH]);
return new Nette\Security\Identity($row[self::COLUMN_ID], $row[self::COLUMN_ROLE], $arr);
}
/**
* Adds new user.
* @param string
* @param string
* @param string
* @return void
* @throws DuplicateNameException
*/
public function add($username, $email, $password, $telephone, $teamname, $teamnameshort, $country)
{
try {
// $this->database->table(self::TABLE_NAME)->insert([
// self::COLUMN_NAME => $username,
// self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
// self::COLUMN_EMAIL => $email,
// self::COLUMN_TELEPHONE => $telephone,
// self::COLUMN_ROLE => 0,
// ]);
$user = new User();
$user->login = $username;
$user->email = $email;
$user->password = Passwords::hash($password);
$user->telephone = $telephone;
$this->em->persist($user);
$this->em->flush();
} catch (Nette\Database\UniqueConstraintViolationException $e) {
throw new DuplicateNameException;
}
}
}
class DuplicateNameException extends \Exception
{}
- her-ur
- Člen | 20
Nejdřív tu Doctrinu musíš do Nette nějak dostat a nakonfigurovat jí. V tom ti nejlépe pomůže kdyby/doctrine. Zprovoznění je jednoduché.
- Jecma
- Člen | 9
Pokud už máš Doctrinu nastavenou, pak máš chybu v UserManageru.
Ve službách injectuj závislosti přes konstruktor ne pomocí inject
anotace.
public function __construct(\Kdyby\Doctrine\EntityManager $em)
{
$this->em = $em;
}
V tvém UserManageru není služba EntityManager zaregistrovaná, proto ta chyba “Call to a member function persist() on null”.
Editoval Jecma (15. 11. 2016 8:36)
- jarda256
- Člen | 130
Jecma napsal(a):
Pokud už máš Doctrinu nastavenou, pak máš chybu v UserManageru.
Ve službách injectuj závislosti přes konstruktor ne pomocí inject anotace.public function __construct(\Kdyby\Doctrine\EntityManager $em) { $this->em = $em; }
V tvém UserManageru není služba EntityManager zaregistrovaná, proto ta chyba “Call to a member function persist() on null”.
Děkuju. To bylo přesně ono. V nějakém návodu jsem našel ten způsob pomocí inject anotace. To může někde fungovat nebo všude musím přes konstruktor?
- Oli
- Člen | 1215
Funguje to v presenterech. Někdo říká, že to je doporučovaný (lepší). Já to nepoužívám nikde. Všude injectuju přes constructor a v base presenteru přes inject metodu. Pak nemusíš přemýšlet jestli to pujde nebo ne… Je to víc psaní, které za tebe ale napíše IDE, takže… :)
- Jecma
- Člen | 9
Získávání
závislostí
TLDR:
V presenterech používej @inject anotaci (proměnná musí být
public)
V komponentách a službách konstruktor