No service of type Nette\Database\Context found

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

Zdravím,

píšu první aplikaci (mám hotovo přihlašování uživatelů a jednoduchou stránku s několika odkazy na různé podstránky) Chtěl bych na jedné z nich (Committee) zobrazit výpis uživatelů. Zkoušel jsem postupovat podle návodu „píšeme první aplikaci“ ale už při definici konstruktoru (

public function __construct(\Nette\Database\Context $database

No service of type Nette\Database\Context found. Make sure the type hint in Method FrontModule\CommitteePresenter::__construct() is written correctly and service of this type is registered

Stuktura podstatné části mé aplikace je:

  • app..AdminModule

    ..Frontmodule..presenters..CommitteePresenter.php // zde potřebuji definovat proměnnou pro práci s DB abych ji mohl použít v šabloně.

    ..templates..@layout.latte
    ..Committee.defaulte.latte
    ..Defaulte.defaulte.latte

    ..presenters..BasePresenter

    ..config..neon

  • libs..aclProj

    ..nette

  • Nette
  • Recourses
  • temp
  • www

neon:

common:
	php:
		session.save_path	: "%tempDir%/sessions"

	nette:
		session:
			autoStart: smart
			expiration: +180days

		application:
			debugger: true
			#catchExceptions: true
			errorPresenter: Error

		security:
			debugger: true


	services:
		database:
			class: Nette\Database\Connection(
				'%database.driver%:host=%database.host%;dbname=%database.dbname%'
				%database.user%
				%database.password%
			)
			setup:
				- setCacheStorage(...)

		authorizator:
			class: AclProj\Security\Acl

		authenticator:
			class: AclProj\Security\Authenticator(@database, %security.salt%)

	factories:


	parameters:
		authAction: Auth:login

production < common:
	parameters:
		database:
			driver: mysql
			host: localhost
			dbname: log
			user: root
			password:



development < common:
	parameters:
		database:
			driver	: mysql
			host	: localhost
			dbname	: log
			user	: root
			password:

		security:
			salt: zb1g7IHt1I

Committee presenter:

namespace FrontModule;


class CommitteePresenter extends \BasePresenter
{

  /** @var Nette\Database\Context */
    private $database;

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

       public function renderDefault()
{
    $this->template->posts = $this->database->table('posts')
        ->order('created_at DESC')
        ->limit(5);
}

}

Bohužel zatím moc nerozumím pojmům namespaces a use, myslím že bude chyba tady, abych mohl spravne odkazat na Nette..Budu vděčnej za jakoukoliv pomoc:-)

David Matějka
Moderator | 6445
+
+1
-

spatne se pripojujes k databazi, viz https://github.com/…g.local.neon

JanBE
Člen | 62
+
0
-

matej21 napsal(a):

spatne se pripojujes k databazi, viz https://github.com/…g.local.neon

Díky, to už jsem taky zkoušel, ale nezabralo to. Pokud to přihlašování změním u

	services:
		database:
			class: Nette\Database\Connection(
				'%database.driver%:host=%database.host%;dbname=%database.dbname%'
				%database.user%
				%database.password%
			)
			setup:
				- setCacheStorage(...)

tak mi nepůjde přihlašování (údaje tahám taky z db)

a pokud připojení změním u dolní definice tak vyskočí chyba, že postrádá definici driveru…

David Matějka
Moderator | 6445
+
0
-

ten zapis v services nepouzivej. pouzij to ze sandboxu a kdyztak rekni, jakou chybu ti to hlasi

mas nette 2.1? quickstart je psanej pro to..

JanBE
Člen | 62
+
0
-

matej21 napsal(a):

ten zapis v services nepouzivej. pouzij to ze sandboxu a kdyztak rekni, jakou chybu ti to hlasi

mas nette 2.1? quickstart je psanej pro to..

Díky za radu:-) Service jsem nepouzil a problém byl v tom, že jsem neměl 2.1.

JanBE
Člen | 62
+
0
-

JanBE napsal(a):

matej21 napsal(a):

ten zapis v services nepouzivej. pouzij to ze sandboxu a kdyztak rekni, jakou chybu ti to hlasi

mas nette 2.1? quickstart je psanej pro to..

Díky za radu:-) Service jsem nepouzil a problém byl v tom, že jsem neměl 2.1.

Akorát mi teď zlobí login stránka (mysli, že tam jsem kvůli něčemu potřeboval verzi 2.08).. Vypisuje:

User Deprecated

Nette\Application\UI\Presenter::getApplication() is deprecated; use dependency injection instead

Jiří Nápravník
Člen | 710
+
0
-

Ta chybová hláška mluví jasně použij DI, mělo by stačit tam kde tohle máš tak v konstruktoru té třídy udělej:

pokud je to presenter

/**
* @inject
* @var Nette\Application\Application
*/
public $application;

pokud to není presenter tak v té třídě musíš mít:

protected $application;

public function __construct(\Nette\Application\Application $application)
{
	parent::__construct();
	$this->application = $application;
}

v obou případech pak díky tomuto můžeš nahradit, volání
Nette\Application\UI\Presenter::getApplication()
za
$this->application

více je od dependency injection v dokumentaci, případně na youtube kanale posoboty

JanBE
Člen | 62
+
0
-

Děkuju za tip na kanál Posobota:-)..

Ještě se mi to nepodařilo vyřešit. Je to v presenteru (basepresenteru) při použití startup().

Jeho kód jsem upravil (nevím jsetli správně) na:

namespace AdminModule;


use Nette\Security\User,
    Nette\Application\Application;

abstract class BasePresenter extends \BasePresenter
{

  /**
  * @inject
  * @var Nette\Application\Application
  */
  public $application;

	public function startup()
	{

		parent::startup();

		if (!$this->user->isLoggedIn() && !$this->user->isAllowed($this->name, $this->action)) {
			if ($this->user->getLogoutReason() === User::INACTIVITY) {
				$this->flashMessage('Session timeout, you have been logged out', 'danger');
			}



       $this->redirect($this->context->params['authAction'], array('backlink' => $this->storeRequest()));

		} else {
			if (!$this->user->isAllowed($this->name, $this->action)) {
				$this->flashMessage('Access denied. You don\'t have permissions to view that page.', 'danger');
				$this->redirect('Default:');
			}
		}
	}

}

Pokud spustím tento kód, potom mi hlasí chybu:

Service ‚params‘ not found