Nette a doctrine uprava UserManager.php pridani uzivatele

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

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

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

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

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

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

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