No service of type Nette\Database\Context found
- JanBE
- Člen | 62
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
spatne se pripojujes k databazi, viz https://github.com/…g.local.neon
- JanBE
- Člen | 62
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
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
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
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
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