Služba – Autowiring a parametr

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

Zdravim, nejak jsem se zaseknul na blbosti. Vytvářím modelUser:

userModel.php

namespace globesphere\model;

class UserModel {

    /** @var \Nette\Database\Connection Database connection */
    private $database;

    private $user_table;

    private $id;
    private $login;
    private $email;
    private $password;
    private $password_salt;
    private $reg_time;

    function __construct(\Nette\Database\Connection $database, $user_table) {
        $this->database = $database;
        $this->user_table = $user_table;
    }

    function getById($id){
        $this->database->quote("SELECT * FROM ? WHERE id=?");
    }


    function getId() {
        return $this->id;
    }

    function getLogin() {
        return $this->login;
    }
.
.
.

Tomuto modelu chci přadat databazi ( pomoci AW přes konstruktor ) a nazev tabulky z konfigu.

config_user.neon

parameters:
    user_table_name: %prefix%user

services:
    userModel:
        class: globesphere\model\UserModel
        user_table: %user_table_name%

Zkoušel jsem různé konfigurace, různé přístupy ale vždy skončím na tom že AW očekává DB nebo neparsuje parametr.. Pročetl jsem komplet help kolem konfigurace a quick start bohužel jsem nenašel žádný důkladný návod popisující propojení configu a modelu, služeb a AW.

Můžete mě někam odkázat nebo nakopnout správným směrem ? Díky.

CZechBoY
Člen | 3608
+
0
-

zkus to takhle

services:
	-
		class: globespeher\model\UserModel
		parameters: [user_table: %user_table_name%]

Editoval CZechBoY (29. 12. 2016 12:42)

Jan Mikeš
Člen | 771
+
+5
-

Ahoj, zápis který hledáš je tento:

services:
	- globesphere\model\UserModel(..., %user_table_name%)

	## Případně toto, pokud nutně potřebuješ službu pojmenovat
	userModel: globesphere\model\UserModel(..., %user_table_name%)

Lepší je uvádět parametry předáváné ručně v konstruktoru jako první, to ti umožní následující jednodušší zápis:

function __construct($user_table, Connection $database) {
        $this->database = $database;
        $this->user_table = $user_table;
    }
services:
	- globesphere\model\UserModel(%user_table_name%)
	## nebo
	userModel: globesphere\model\UserModel(%user_table_name%)

Rád bych se zeptal co plánuješ s properties v modelu $id, $login, $email atd.., to jsou properties jednotlivých řádků v tabulce? Zavání to totiž špatným návrhem. To co možná hledáš jsou entity v doctrine.

Editoval Jan Mikeš (29. 12. 2016 12:47)

Fires
Člen | 97
+
0
-

Reprezentuji jednotlivé sloupce tabulky .. Vim ze je to pravdepodobně špatný návrh. počítám že lepší by bylo využít jednu property user typu activerow. Doctrine nepouzivam :(

CZechBoY
Člen | 3608
+
+2
-

Tak můžeš vracet nějakou obyč entitu, nemusí to být nutně z frameworku, jen nebude moc chytrá.

class UserEntity
{
	public function __construct(IRow $row)
	{
		...
	}

	public function getId()
	{
		return $this->id;
	}

	public function getLogin()
	{
		return $this->login;
	}
}
Fires
Člen | 97
+
0
-

Zeptám se ještě zda je můj přistup tedy správny

chci vytvořit 2 třidy – userEntity a userModel

userEntity – bude představovat záznam z db vč. metod save, edit etc.
userModel – bude získávat konkretní instance userEntity

Je to už pár let co jsem v nette dělal a koukám ze vše se hodně změnilo a bestpractice už je někde úplně jinde :(

Editoval Fires (29. 12. 2016 15:17)

CZechBoY
Člen | 3608
+
0
-

Tak si nejdřív rozmysli jestli chceš jenom hloupý přepravky (viz. moje ukázka UserEntity), nebo chytřejší, který už umí editaci řádku v databázi – potom bych použil třeba YetORM (pokud chceš zůstat u Nette\Database).