Připojení k databázi nefunguje v Modelu
- Trsak
- Člen | 22
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
jak mas registrovanou sluzbu Users? ma byt pod sekci services. Dle chybove hlasky to vypada, ze se to snazis dostat do sekce extensions
- stewestw
- Člen | 42
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
@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