Quickstart → služba model nebyla nalezena
- Frozen
- Člen | 19
Dobrý den,
jsem úplný nováček a začal jsem dle návodu.
Stáhl jsem si verzi pro php 5,3.
Spustil checker, který prošel. Nahrál soubory ze sandboxu a editoval do doby
než přišlo na řadu vytvoření vlastního presenteru. Zde mi začalo nette
házet chybu 500 internal server error. V logu jsem zjistil, že nemůže
nalézt službu model.
Zde na fóru jsem našel už tento problém a že to vyřešilo smáznutí cache, bohužel u mně ne :(
přikládám kód vložený v config.neon
hosting:savana
editor:netbean
Model.php se třídou model mám ve složce models
#
# SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
#
# If you don't protect this directory from direct web access, anybody will be able to see your passwords.
# https://nette.org/en/security-warning
#
common:
parameters:
database:
driver: mysql
host: localhost
dbname: m_nette
user: m_nette
password: xxxxx
php:
date.timezone: Europe/Prague
# session.save_path: "%tempDir%/sessions"
# zlib.output_compression: yes
nette:
database:
default:
dsn: '%database.driver%:host=%database.host%;dbname=%database.dbname%'
user: %database.user%
password: %database.password%
services:
database: @\NConnection
model: Model( @database )
authenticator: Authenticator( @model::getUsers() )
factories:
production < common:
development < common:
předem děkuji za jakýkoliv postřeh.
Frozen
- Frozen
- Člen | 19
Presenter:
<?php
/**
* Homepage presenter.
*
* @author John Doe
* @package MyApplication
*/
class HomepagePresenter extends BasePresenter
{
private $model;
public function startup()
{
parent::startup();
$this->model = $this->getService('model');
}
public function renderDefault()
{
$this->template->tasks = $this->model->getTasks()
->where(array('done' => false))->order('created ASC');
}
}
model:
class Model extends Nette\Object{
public $database;
public function __construct(Nette\Database\Connection $database) {
$this->database = $database;
}
public function getTasks(){
$this->database->table('task');
}
public function getTaskLists(){
$this->database->table('tasklist');
}
public function getUsers(){
$this->database->table('user');
}
}
- hAssassin
- Člen | 293
Pocky, proc ti ladenka hlasi ze nemuze najit NConnection
, cili
verzi s prefixama ale v kodu pouzivas namespace? Mas asi stazenou spatnou
verzi nette…
Coz bude asi i problem toho modelu, protoze v prefixed verzi neni
Nette\Object
ale NObject
. Jo a kdyby to nevalilo tak
zkus dat pred nazev tridy jeste \
jako
\Nette\Object
apod.
- Foizo
- Člen | 22
Zdravím,
zkouším/učím se na localhostu framework nette a mám podobnej problém, zasekl jsem se u části „Vytvoření presenteru“. Hází mi to chybu „Service ‚model‘ not found“. Mám totožné obsahy jednotlivých souboru jako zde psal Frozen. Používám NetteFramework-2.0rc2-PHP5.3, a NetBeans 7.1 s pluginem 1326401582_org-netbeans-modules-php-nette.nbm. A chyba je dle Laděnky v Homepagepresenter.php – 16: $this->model = $this->getService (‚model‘);
<?php
/**
* Homepage presenter.
*
* @author John Doe
* @package MyApplication
*/
class HomepagePresenter extends BasePresenter
{
private $model;
public function startup()
{
parent::startup();
$this->model = $this->getService ('model');
}
public function renderDefault()
{
$this->template->task = $this->model->getTask()
->where(array('done' => false))->order('created ASC');
}
}
- Foizo
- Člen | 22
tak boothstrap.php
<?php
/**
* My Application bootstrap file.
*/
use Nette\Application\Routers\Route;
// Load Nette Framework
require LIBS_DIR . '/Nette/loader.php';
// Configure application
$configurator = new Nette\Config\Configurator;
//$configurator->setProductionMode($configurator::AUTO)
$configurator->setTempDirectory(__DIR__ . '/../temp');
// Enable Nette Debugger for error visualisation & logging
//Debugger::$logDirectory = __DIR__ . '/../log';
//Debugger::$strictMode = TRUE;
$configurator->enableDebugger(__DIR__ . '/../log');
// Enable RobotLoader - this will load all classes automatically
$configurator->createRobotLoader()
->addDirectory(APP_DIR)
->addDirectory(LIBS_DIR)
->register();
// Create Dependency Injection container from config.neon file
$container = $configurator->createContainer();
$configurator->addConfig(__DIR__ . '/config/config.neon');
// Setup router
$container->router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
$container->router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
// Configure and run the application!
$application = $container->application;
$application->errorPresenter = 'Error';
$container->application->run();
?>
Jinak ten řádek s Nette\Dia… jsem dal tam kam jste psal a vypsalo mi to chybu v laděnce,kde je označen červeně s řádek 16. Když dám ESC tak mám jen práznou stránku, s možností otevření laděnky (vpravém horním rohu).
<?php
6: * @author John Doe
7: * @package MyApplication
8: */
9: class HomepagePresenter extends BasePresenter
10: {
11: private $model;
12:
13: public function startup()
14: {
15: parent::startup();
16: Nette\Diagnostics\Debugger::dump($this->context->model);
17: $this->model = $this->getService ('model');
18: }
19:
20: public function renderDefault()
?>
- Foizo
- Člen | 22
Nette\DI\MissingServiceException
Service ‚model‘ not found.
Call stack ▼
...\libs\Nette\DI\Container.php:308 source ► Nette\DI\Container-> getService (arguments ►)
...\app\presenters\HomepagePresenter.php:16 source ► Nette\DI\Container-> __get (arguments ▼)
$name
"model" (5)
6: * @author John Doe
7: * @package MyApplication
8: */
9: class HomepagePresenter extends BasePresenter
10: {
11: private $model;
12:
13: public function startup()
14: {
15: parent::startup();
16: Nette\Diagnostics\Debugger::dump($this->context->model);
17: $this->model = $this->getService ('model');
18: }
19:
20: public function renderDefault()
...\libs\Nette\Application\UI\Presenter.php:176 source ► HomepagePresenter-> startup ()
...\libs\Nette\Application\Application.php:131 source ► Nette\Application\UI\Presenter-> run (arguments ►)
...\app\bootstrap.php:40 source ► Nette\Application\Application-> run ()
...\www\index.php:16 source ► require (arguments ►)
- Foizo
- Člen | 22
=o/
NOTICE
Use of undefined constant MODELS_DIR – assumed ‚MODELS_DIR‘
22: // Enable RobotLoader – this will load all classes automatically
23: $configurator->createRobotLoader()
24: ->addDirectory(APP_DIR)
25: ->addDirectory(LIBS_DIR)
26: ->addDirectory(MODELS_DIR)
27: ->register();
- Foizo
- Člen | 22
jojo cache mažu teď už před každym refreshem stránky po každý úpravě.. dělám to na XAMPP – http://localhost/…ckstart/www/
- hAssassin
- Člen | 293
kde ze jsi rikal ze ten model mas umisteny? Ve slozce Model
? Ale
kde? V rootu nebo v App? Myslim ze ji RobotLoader nenajde… Takze bud si
definuj constantu MODELS_DIR
, jak psal ViPErCZ nebo tu
slozku presun do App
.
[OT]@ViPEr*CZ*> mas super prezdivku, Texy! to nedokaze oznacit tucne :D[/OT]
- Foizo
- Člen | 22
<?php
#
# SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
#
# If you don't protect this directory from direct web access, anybody will be able to see your passwords.
# https://nette.org/en/security-warning
#
common:
parameters:
database:
driver: mysql
host: localhost
dbname: quickstart
user: root
password:
php:
date.timezone: Europe/Prague
# session.save_path: "%tempDir%/sessions"
# zlib.output_compression: yes
nette:
session:
autoStart: smart
database:
default:
dsn: '%database.driver%:host=%database.host%;dbname=%database.dbname%'
user: %database.user%
password: %database.password%
services:
database: @Nette\Database\Connection
model: Model( @database )
authenticator: Authenticator( @database::table(users) )
factories:
production < common:
development < common:
?>
- spidy
- Člen | 55
Aha, už to mám :). Chyba byla celou dobu v tom boostrapu. Prohoď řádky
$container = $configurator->createContainer();
$configurator->addConfig(__DIR__ . '/config/config.neon');
Takhle se nejdřív vytvoří container a až potom načte ten config, takže se nevytvoří požadované servicy…
- Foizo
- Člen | 22
tak už se to pohnulo zase o kus dál =) ALE.. Nevím jak se to v NetBeans s řádkováním musel sem v config.neon správně zařádkovat v services: model (zobrazil sem si netisknutelné znaky a podle toho to umístil) Víte něco o tom jak tomu předcházet? Vždy mi to u toho model: hodilo chybu a Laděnka mi ukázala že je špatně posunutej v řádku.
To spidy: přehodil jsem to a teď mi to pro změnu hlásí chybu „Class Nette\Database\Connectionmodel has not been found.“ A označilo mi to řádek v bootstrap.php a to
$container = $configurator->createContainer();
Takže si to vykládám tak že někde chybí zápis pro třídu spojení s databází?
- Frozen
- Člen | 19
tak se mi to povedlo „úspěšně rozběhnout“ až na.. v template default.latte kde chci vypsat jména autorů
<td>{$task->user->name}</td>
mi to hodí chybu 500. Pokud zde dám třeba výpis textu jako je výše tak
vše proběhne v pořádku.
Můžete mě nasměrovat kde mam hledat chybu? Laděnka se mi v tomto
případě neotevře.
- ViPEr*CZ*
- Člen | 817
No pokud si to dobře nastavíte… a projdete si nové nastavení zde na
foru… pak Nette DEVELOPMENT mód zapisuje chyby do log souboru.
Chyba může být způsobena tím, že v task nic neposíláte… nebo, že se
máte špatně DB a tudíž se nepovede najít sloupec name přes cizý klíč
z usera.
- Frozen
- Člen | 19
struktura DB:
-- Databáze: `m_nette
--
-- --------------------------------------------------------
--
– Struktura tabulky task
--
CREATE TABLE IF NOT EXISTS task
(
id
int(10) unsigned NOT NULL AUTO_INCREMENT,
text
varchar(100) NOT NULL,
created
datetime NOT NULL,
done
tinyint(1) unsigned NOT NULL DEFAULT ‚0‘,
user_id
int(10) unsigned NOT NULL,
tasklist_id
int(10) unsigned NOT NULL,
PRIMARY KEY (id
),
KEY order
(tasklist_id
,done
,created
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;
-- --------------------------------------------------------
--
– Struktura tabulky tasklist
--
CREATE TABLE IF NOT EXISTS tasklist
(
id
int(10) unsigned NOT NULL AUTO_INCREMENT,
title
varchar(50) NOT NULL,
PRIMARY KEY (id
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
-- --------------------------------------------------------
--
– Struktura tabulky user
--
CREATE TABLE IF NOT EXISTS user
(
id
int(10) unsigned NOT NULL AUTO_INCREMENT,
username
varchar(20) NOT NULL,
password
char(128) NOT NULL,
name
varchar(30) NOT NULL,
PRIMARY KEY (id
),
UNIQUE KEY username
(username
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;`
tabulky jsou naplněny daty ze souboru v návodu
Editoval Frozen (31. 1. 2012 12:28)
- ViPEr*CZ*
- Člen | 817
hlásí chybu: Call to undefined method Model::getTaskLists().
Že by v modelu chyběla metoda Model::getTaskLists().
PS: V tý DB nevidím nikde FOREIGN klíče, proto Vám to nefunguje…
protože neexistuje cizý klíč user_id (to že existuje sloupec user_id
nestačí) zkuste se mrknout do google co a jak se takové klíče dělají.
https://cs.wikipedia.org/…%C3%AD%C4%8D
- Foizo
- Člen | 22
to ViPErCZ, jo už sem na to přišl chyběli mi „s“ v Model.php, taky sem to hned smazal když sem viděl že neumim psát =)
ale co třeba: Undefined variable: tasks
v Homepage.default.late
ten vypadá takto – přesně dle návodu
{block content}
<h1>{$taskList->title}</h1>
<table>
<thead>
<tr>
<th>Čas vytvoření</th>
<th>Úkol</th>
<th>Přiřazeno</th>
</tr>
</thead>
<tbody>
{foreach $tasks as $task}
<tr>
<td>{$task->created|date:'j. n. Y'}</td>
<td>{$task->text}</td>
<td>{$task->user->name}</td>
</tr>
{/foreach}
</tbody>
</table>
{/block}
- Panda
- Člen | 569
Momentálně se v této diskuzi vůbec nevyznám a nevím, kde byly jaké chyby a nevím, jestli je to chyba na straně quickstartu, nebo to je jen nějaký překlep nebo prohozené řádky.
Proto Vás prosím, dodržujte nějakou úroveň hlášení chyb – vždy přesná hláška chyby + uvedení kódu, kde k ní dochází, případě co s chybou souvisí – pokud je chyba v šabloně (například neexistující proměnná), tak je možné, že chyba nebude v šabloně, ale v presenteru, proto uveďte i jeho kód.
Pokud Vám laděnka nehlásí chyby, tak buď nepracujete na localhostu a
urychleně se tam přesuňte, vývoj na hostingu nemá co dělat, nebo jste se
hrabali v bootstrap.php
a vypnuli jste si laděnku.
Pokud nějakou chybu opravíte a najednou to začne fungovat, tak prosím uveďte co nejlépe v čem byla chyba. Ideální by bylo i uvést původní a opravený kód. Momentálně nemám na testování QS čas, takže nevím, jestli správně funguje na Nette 2.0 RC2.
Díky za spolupráci!
ViPErCZ: foreign keys by právě potřeba být neměly.
Alespoň mě to bez nich funguje (na základě konvence s _id
).
Foizo: pokud neexistuje proměnná $tasks
, tak
jí nepředáváš v presenteru.
Editoval Panda (31. 1. 2012 14:17)
- Foizo
- Člen | 22
jojo byl tam překlep/nedoklep =) jen task
jo je to zmatek chyba za chybou..=o/ ted zas „No reference found for $task->user.“
řádek 30. ve:
…\temp\cache\_Nette.FileTemplate\_Homepage.default.latte-8f76136ece20150a83ecb18122e0128a.php:30
source ► Nette\Database\Table\ActiveRow→ __get (arguments ►)
Jedná se o:
<td><?php echo Nette\Templating\Helpers::escapeHtml($task->user->name, ENT_NOQUOTES) ?></td>
--\
Výpis Laděnky
<?php //netteCache[01]000391a:2:{s:4:"time";s:21:"0.12788900 1328015612";s:9:"callbacks";a:2:{i:0;a:3:{i:0;a:2:{i:0;s:19:"Nette\Caching\Cache";i:1;s:9:"checkFile";}i:1;s:69:"C:\xampp\htdocs\nette-quickstart\app\templates\Homepage\default.latte";i:2;i:1328015242;}i:1;a:3:{i:0;a:2:{i:0;s:19:"Nette\Caching\Cache";i:1;s:10:"checkConst";}i:1;s:25:"Nette\Framework::REVISION";i:2;s:30:"d6dc926 released on 2012-01-28";}}}?><?php
// source file: C:\xampp\htdocs\nette-quickstart\app\templates\Homepage\default.latte
?><?php
// prolog Nette\Latte\Macros\CoreMacros
list($_l, $_g) = Nette\Latte\Macros\CoreMacros::initRuntime($template, 'ufi5b4s8vj')
;
// prolog Nette\Latte\Macros\UIMacros
//
// block content
//
if (!function_exists($_l->blocks['content'][] = '_lbf0985e7a31_content')) { function _lbf0985e7a31_content($_l, $_args) { extract($_args)
?>
<h1>Nesplněné úkoly</h1>
<table>
<thead>
<tr>
<th>Čas vytvoření</th>
<th>Úkol</th>
<th>Přiřazeno</th>
</tr>
</thead>
<tbody>
<?php $iterations = 0; foreach ($tasks as $task): ?>
<tr>
<td><?php echo Nette\Templating\Helpers::escapeHtml($template->date($task->created, 'j. n. Y'), ENT_NOQUOTES) ?></td>
<td><?php echo Nette\Templating\Helpers::escapeHtml($task->text, ENT_NOQUOTES) ?></td>
<td><?php echo Nette\Templating\Helpers::escapeHtml($task->user->name, ENT_NOQUOTES) ?></td>
</tr>
<?php $iterations++; endforeach ?>
</tbody>
</table>
<?php
}}
//
// end of blocks
//
// template extending and snippets support
$_l->extends = empty($template->_extended) && isset($_control) && $_control instanceof Nette\Application\UI\Presenter ? $_control->findLayoutTemplateFile() : NULL; $template->_extended = $_extended = TRUE;
if ($_l->extends) {
ob_start();
} elseif (!empty($_control->snippetMode)) {
return Nette\Latte\Macros\UIMacros::renderSnippets($_control, $_l, get_defined_vars());
}
//
// main template
//
?>
<?php if ($_l->extends) { ob_end_clean(); return Nette\Latte\Macros\CoreMacros::includeTemplate($_l->extends, get_defined_vars(), $template)->render(); }
call_user_func(reset($_l->blocks['content']), $_l, get_defined_vars()) ;
--\