Quickstart → služba model nebyla nalezena

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

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

hAssassin
Člen | 293
+
0
-

to nam bohuzel moc nerekne. posli spis ladenku nebo kod prezenteru/modelu. tipuju spatny namespace…

Frozen
Člen | 19
+
0
-

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');
    }



}
Frozen
Člen | 19
+
0
-

Odkaz na laděnku, jestli to je teda ono :)
laděnka

akorát nevím, teda proč to zde hlásí jinou chybu než z logu…

hAssassin
Člen | 293
+
0
-

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.

Frozen
Člen | 19
+
0
-

Teď mě napadlo, že to může být tím, že jsem si tu našel na fórku plugin do netbeansu, kterej teda je asi dělanej na tu verzi s prefixama… zkusím teda ještě jednou to projít celé bez použití toho pluginu. Dík za postřeh.

Rellik
Člen | 104
+
0
-

Taky sem měl problém s těmi různými verzemi nette když sem začínal. Pak sem to všechno smazal, stáhnul verzi pro php 5.3 se jmennými prostory a byl klid a všechno fungovalo.
Jinak myslím není moc moudré vystavovat přihlašovací údaje do databáze veřejně… ;-)

Foizo
Člen | 22
+
0
-

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');
        }

}
ViPEr*CZ*
Člen | 814
+
0
-

Takže v config.neon si vytváříte službu model?
Co ukáže:

Nette\Diagnostics\Debugger::dump($this->context->model);
Foizo
Člen | 22
+
0
-

ano v config.neon

<?php
services:
		database: @Nette\Database\Connection
                model: Model( @database )
		authenticator: Authenticator( @database::table(users) )
?>

Jinak nevím co tím myslíte „co ukáže…“ vůbec newim co s tím =)

ViPEr*CZ*
Člen | 814
+
0
-

Dejte to před:

$this->model = $this->getService ('model');

To vypíše co obsahuje $this->context->model … ale asi pod laděnku… je třeba stisknout ESC, aby bylo vidět co je za ní.
A pošlete ještě výpis z bootstrap.php.

Foizo
Člen | 22
+
0
-

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()
?>
spidy
Člen | 55
+
0
-

A jakou chybu to přesně vypisuje?

Foizo
Člen | 22
+
0
-

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 ►)
ViPEr*CZ*
Člen | 814
+
0
-

Já to teda ještě dělám takto:

$configurator->createRobotLoader()
	->addDirectory(APP_DIR)
	->addDirectory(LIBS_DIR)
	->addDirectory(MODELS_DIR)
	->register();
spidy
Člen | 55
+
0
-

Uff, tak nevím… Zkoušel jsi smazat cache? Případně se koukni do složky temp/cache/_Nette.Configurator, tam by měl být jeden soubor s třídou SystemContainer, jestli v ní je metoda createServiceModel.

Foizo
Člen | 22
+
0
-

=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
+
0
-

třída SystemContainer tam je, ale o createServiceModel ani zmíňka

Panda
Člen | 569
+
0
-

Smazal jsi cache? A neprovozuješ to náhodou někde na hostingu?

Foizo
Člen | 22
+
0
-

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
+
0
-

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]

spidy
Člen | 55
+
0
-

@Foizo: A servicy database a authenticator existují?

@hAssassin: Kdyby to nenašel RobotLoader, tak vyhodí výjimku už na začátku, ne?

Editoval spidy (30. 1. 2012 22:30)

Foizo
Člen | 22
+
0
-

to hAssassin: Model.php mám v app/models/

to spidy: ne ty tam taky nejsou

spidy
Člen | 55
+
0
-

Můžeš ještě poslat celý config.neon?

Foizo
Člen | 22
+
0
-
<?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
+
0
-

Tak zkus ještě v presenteru dump($this->context->hasService('nette.database.default')); (někde před tím, než se vyhodí ta chyba) a zase potom schovat laděnku, mělo by to vypsat TRUE nebo FALSE.

Foizo
Člen | 22
+
0
-

FALSE

Panda
Člen | 569
+
0
-

Můžeš prosím celý ten projekt zazipovat a někam nahrát? Chová se to divně a asi to bude lepší, než si tady takhle hrát lodě…

Foizo
Člen | 22
+
0
-

Já jdu spát už mi z toho hrabe, ráno tu zas budu… díky za snahu zatim pánové…

spidy
Člen | 55
+
0
-

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
+
0
-

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
+
0
-

Rellik napsal(a):
Jinak myslím není moc moudré vystavovat přihlašovací údaje do databáze veřejně… ;-)

Heslo je jiné než je zde uvedeno :)

Michalek
Člen | 210
+
0
-

I jiné než ve výpisu laděnky co tu byla? :)

Editoval Michalek (31. 1. 2012 9:44)

ViPEr*CZ*
Člen | 814
+
0
-

@hAssassin
Díky :-D

@Foizo
Tak je jasné, že se musí ta konstanta nejdříve definovat… stejně jako APP_DIR a LIBS_DIR. Bootstrap je nejlepší použít ze sandboxu, pak se nemůžete splést s prohozením nějakého řádku.

Foizo
Člen | 22
+
0
-

no nic, smáznu a začnu znovu…

spidy
Člen | 55
+
0
-

@**Foizo**: To co jsi nahrál na ulož to mi funguje, stačí prohodit ty dva řádky a ještě máš v šabloně Homepage:default {/forearch}

Foizo
Člen | 22
+
0
-

to spidy: jo k tomu sem se pak taky dopracoval.. Ale teď jedu znovu na novo tak snad se zadaří..

Foizo
Člen | 22
+
0
-

No a konečně mi to fachá…yeeeaaaaahhh,ale stejně vim h*vno =o)

Frozen
Člen | 19
+
0
-

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 | 814
+
0
-

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
+
0
-

v logu mi to hází:
No reference found for $task->user.

Db mám vytvořenou přes sql dotaz zde v návodu.
Spíš bych to viděl, tak že se nepodaří najít table user přes sloupec user_id. Ovšem netuším proč…

Frozen
Člen | 19
+
0
-

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)

Foizo
Člen | 22
+
0
-

stojím u toho samého problému =o/

ViPEr*CZ*
Člen | 814
+
0
-
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
+
0
-

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}
spidy
Člen | 55
+
0
-

A máš v HomepagePresenter::renderDefault() $this->template->tasks = neco...?

Panda
Člen | 569
+
0
-

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
+
0
-

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()) ;

--\
Panda
Člen | 569
+
0
-

U šablon prosím kód šablony, ne vygenerovaný PHP kód!

Udělej prosím export celé databáze včetně dat a spolu s celým kódem projektu mi to někam nahraj. Kouknu na to.