Připojení k databázi nefunguje v Modelu

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

Zdravím,
nevím si s tím už rady, pořád dostávám tuto chybu:
Recoverable Error

Argument 1 passed to App\Model\Users::__construct() must be an instance of Nette\Database\Context, none given, called in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\vendor\nette\di\src\DI\Extensions\ExtensionsExtension.php on line 28 and defined

config.local.neon:

database:
	dsn: 'mysql:host=127.0.0.1;dbname=db
	user: root
	password:
	options:
		lazy: yes

Model:

<?php
namespace App\Model;

use Nette;

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["username"] = "username";
        $data["email"] = "email";
        $data["password"] = $data["password"];

        return $this->database->table('users')->insert($data);
    }
}
David Matějka
Moderator | 6445
+
0
-

jak mas registrovanou sluzbu Users? ma byt pod sekci services. Dle chybove hlasky to vypada, ze se to snazis dostat do sekce extensions

Trsak
Člen | 22
+
0
-

Nechápu, jak jsem si toho mohl nevšimnout.. Opravdu to bylo v extenstions.. Díky!

stewestw
Člen | 42
+
0
-

zdravim, je prosim neakym sposobom mozne pouzitie modelu s constructor injection (injektujem databazu) bez registracie v config.neon services?

trejjam
Backer | 65
+
0
-

Pokud bez myslíš bez upravení

database:
	other:
		dsn: 'mysql:host=127.0.0.1;dbname=db

service:
	- App\Model\UseOtherDB(@database.other)

Tak o stejném chování bez registrace nevím (nenapadá mě jak by to mohlo DI poznat)

stewestw
Člen | 42
+
0
-

myslel som, ze ked vytvaram submodul a v nom sa nachadza model, ktory chcem pouzit v presenteri, aby som ho stale nemusel registrovat do services. do neonu by som po nastaveni zakladnej struktury nechcel uz zasahovat, pokial to nebude treba.

v podstate sa chcem vyhnut tomuto:

services:
        - App\Model\UserManager
		#tento riadok tu nechcem
        - App\AdminModule\ArticlesModule\Model\ArticlesModel
        - App\components\IMenuFactory
        - App\Model\Locate
        router: App\RouterFactory::createRouter

v presenteri modulu teraz volam model, ktory je zaregistrovany v config.neon:

public $model;

public function __construct(ArticlesModel $model) {
    $this->model = $model;
}

a samotny model vola databazu takto:

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

je mozne neako inak zavolat databazu v modeli prosimm, lebo ked nieje registrovany model v services, to nezbehne? :)

Editoval stewestw (5. 2. 2015 8:24)

David Matějka
Moderator | 6445
+
0
-

@stewestw pro funkcni injectovani (a to nejen connection do modelu, ale pak i injection modelu treba do presenteru) je nutne, aby byl model registrovany v DI kontejneru. To se udela prave registrovanim v sekci services. Druhou moznosti jsou tzv. CompilerExtensions – ty mohou taky registrovat sluzby. A diky tomu, ze je pises v php, muzes ty sluzby registrovat vic pruzne a dynamicky. Takze bys treba mohl dle nejakych pravidel najit a registrovat modelove tridy. Ale je to pomerne pokrocile, radeji ti doporucuji pekne poctive je vypsat do sekce services :)
timto zpusobem se v 2.3 registruji automaticky presentery

stewestw
Člen | 42
+
0
-

@matej21 dakujem za info. budem to asi riesit includovanim configov do hlavneho podla tvojho doporucenia :)