Problém: Class App\Model\CalculatorManager used in service ‚25_App_Model_CalculatorManager‘ not found

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

Zdravím,

při hraní si jsem narazil na chybovou hlášku:
‚Class App\Model\CalculatorManager used in service '25_App_Model_CalculatorManager‘ not found or is not instantiable'

Myslím, že důvod této chyby jsem už objevil, ale přesto se chybové hlášky nemůžu zbavit.
Tato chybová hláška se nezměnila ani poté, co jsem přejmenoval soubory a smazal obsah složky temp.

Václav Kraus
Člen | 77
+
0
-

Nejspíš máš třídu CalculatorManager zaregistrovanou v config.neon, ale v aplikaci ji nemáš (minimálně ji nevidí RobotLoader.

ViPEr*CZ*
Člen | 818
+
0
-

Další možností by mohlo být, že třída je abstraktní. :-)

Jarik
Člen | 9
+
0
-

Třída abstraktní není, a snad i namespace by měli být dobře.
Co může být důvodem proč to RobotLoader nevidí? Co by jste potřebovali vidět z kódu?

`

<?php

namespace App\Presenters;

use App\Model\CalcManager;
use Nette\Application\UI\Form;

/**
 * @package App\Presenters
 */
class CalculatorPresenter extends App\Presenters\BasePresenter
{
...

`

namespace App\Presenters;

use App\Model\CalcManager;
use Nette\Application\UI\Form;

/**
 * @package App\Presenters
 */
class CalculatorPresenter extends App\Presenters\BasePresenter
{
...
Šaman
Člen | 2666
+
+2
-

Určitě by bylo dobré ukázat ten CalculatorManager. Přijde mi to nějaké zacyklené, jako bys injectoval třídu samu do sebe.

Jarik
Člen | 9
+
0
-

Calc manager vypadá takto
`

<?php
namespace App\Model;

use Nette\Object;
 /**
 * @package App\Model
 */
class CalcManager extends Object
{
    const
        ADD = 1,
        SUBTRACT = 2,
        MULTIPLY = 3,
        DIVIDE = 4;

    public function getOperations()
    {
        return array(
            self::ADD => 'Sčítání',
            self::SUBTRACT => 'Odčítání',
            self::MULTIPLY => 'Násobení',
            self::DIVIDE => 'Dělení'
        );
    }

    public function calculate($operation, $x, $y)
    {
        switch($operation)
        {
        case self::ADD:
            return $this->add($x,$y);
        case self::SUBTRACT:
            return $this->subtract($x,$y);
        case self::MULTIPLY:
            return $this->multiply($x,$y);
        case self::DIVIDE:
            return $this->divide($x,$y);
        default:
            return null;
        }
    }
    public function add($x, $y)
    {
        return $x + $y;
    }

    public function subtract($x, $y)
    {
        return $x - $y;
    }

    public function multiply($x, $y)
    {
        return $x*$y;
    }

    public function divide($x, $y)
    {
            return round($x/$y);
    }

}

A presenter:
`

<?php

namespace App\Presenters;

use App\Model\CalcManager;
use Nette\Application\UI\Form;

/**
 * @package App\Presenters
 */
class CalculatorPresenter extends App\Presenters\BasePresenter
{
    private $calculatorManager;
    private $result = null;

    public function __construct(CalcManager $calculatorManager)
    {
        parrent::_construct();
        $this->calculatorManager = $calculatorManager;
    }
    public function renderDefault()
    {
        $this->template->result = $this->result;
    }

    const
        FORM_MSG_REQUIRED = 'Tohle pole je povinné',
        FORM_MSG_RULE = 'Tohle pole má neplatný formát';

    protected function createComponentCalculatorForm()
    {
        $form = new Form;
        $form->addRadioList('operation', 'Operace', $this->calculatorManager->getOperations())
                ->setDefaultValue(CalculatorManager::ADD)
                ->setRequirder(self::FORM_MSG_REQUIRED);
        $form->addText('x', 'První číslo: ')->setType('number')
                ->setDefaultalue(0)
                ->setRequired(self::FORM_MSG_REQUIRED)
                ->addRule(form::INTEGER, self::FORM_MSG_RULE);
        $form->addText('y', 'Druhé číslo: ')->setType('number')
                ->setDefaultalue(0)
                ->setRequired(self::FORM_MSG_REQUIRED)
                ->addRule(form::INTEGER, self::FORM_MSG_RULE)
                ->addConditionOn($form['operation'], Form::EQUAL, CalcManager::DIVIDE)
                ->addRule(FORM::PATTERN, 'Nelze dělit nulou.', '^[^0].*');
        $form->addSubmit('calculate', 'Spočítejvýsledek');
        $form->onSuccess[] = [$this, 'calculatorFormSucceded'];
        return $form;
    }

    public function calculatorFormSucceeded($form, $values)
    {
        $this->result = $this->calculatorManager->calculate($values->operation, $values->x, $values->y);
    }


}

Editoval Jarik (20. 12. 2015 20:31)

Václav Kraus
Člen | 77
+
+1
-

Ta třída se ale jmenuje CalcManager a ne CalculatorManager

Jarik
Člen | 9
+
0
-

CalculatorManager je původní název, když jsem začal dostávat tuto chybu, přejmenoval jsem třídu abych zkusil jak se změní chybová hláška.

Chybová hláška se nezměnila, stále „hledá“ třídu CalculatorManager (jako předtím) přestože nyní by měl hlásit absenci třídy „CalcManager“.

Zuben45
Člen | 268
+
0
-

zkus to injectknout takhle

namespace App\Presenters;

use App\Model\CalcManager;
use Nette\Application\UI\Form;

/**
 * @package App\Presenters
 */
class CalculatorPresenter extends BasePresenter
{
    /** \App\Model\CalcManager @inject*/
    private $calculatorManager;

    private $result = null;

    public function __construct()
    {
        //parrent::_construct();
        //$this->calculatorManager = $calculatorManager;
    }

pak můžeš používat

$this->calculatorManager

bez problému ;), více zjistíš zde https://doc.nette.org/…dependencies

Editoval Zuben45 (20. 12. 2015 22:06)

Jarik
Člen | 9
+
0
-

Beze změny.
Navíc stále hledá „CalculatorManager“ místo „CalcManager“, temp jsem promazal takže nechápu kde to bere..

Zuben45
Člen | 268
+
0
-

Jarik napsal(a):

Beze změny.
Navíc stále hledá „CalculatorManager“ místo „CalcManager“, temp jsem promazal takže nechápu kde to bere..

a nevoláš ho ještě někde ?, protože jsem ten model a presenter hodil do sandboxu a funguje.

Jarik
Člen | 9
+
0
-

Ne…
Při první spuštění jsem tam chybu měl,
namespace u CalcManageru jsem měl jako: „namespace App\model\CalcManager“.

Tu jsem následně opravil, přesto se to ale nejspíše stále snaží hledat CalcManager ve složce: „App\model\CalcManager“ místo „App\Model“.

Někde musí být uložena ta původní špatná cesta, ale ve složce temp to není…

Zuben45
Člen | 268
+
0
-

Jarik napsal(a):

Ne…
Při první spuštění jsem tam chybu měl,
namespace u CalcManageru jsem měl jako: „namespace App\model\CalcManager“.

Tu jsem následně opravil, přesto se to ale nejspíše stále snaží hledat CalcManager ve složce: „App\model\CalcManager“ místo „App\Model“.

Někde musí být uložena ta původní špatná cesta, ale ve složce temp to není…

Všiml jsem si že ve formuláři jsi měl ještě starý název u addRadioList v setDefaultValue, tak zkus.

EDIT: Nenastavoval jsi ho i v configu ?

EDIT 2: Tak jsem si hrál a vyzkoušej:

<?php

namespace App\Presenters;


use Nette\Application\UI\Form;

/**
 * @package App\Presenters
 */
class CalculatorPresenter extends BasePresenter
{
    private $calculatorManager;

    private $result = null;

    public function __construct()
    {
        $this->calculatorManager = new \CalcManager();
    }
    public function renderDefault()
    {
        $this->template->result = $this->result;
        $this->template->test = $this->calculatorManager->getOperations();
    }

    const
        FORM_MSG_REQUIRED = 'Tohle pole je povinné',
        FORM_MSG_RULE = 'Tohle pole má neplatný formát';

    protected function createComponentCalculatorForm()
    {
        $form = new Form;
        $form->addRadioList('operation', 'Operace', $this->calculatorManager->getOperations())
                ->setDefaultValue(\CalcManager::ADD)
                ->setRequired(self::FORM_MSG_REQUIRED);
        $form->addText('x', 'První číslo: ')->setType('number')
                ->setDefaultValue(0)
                ->setRequired(self::FORM_MSG_REQUIRED)
                ->addRule(form::INTEGER, self::FORM_MSG_RULE);
        $form->addText('y', 'Druhé číslo: ')->setType('number')
                ->setDefaultValue(0)
                ->setRequired(self::FORM_MSG_REQUIRED)
                ->addRule(form::INTEGER, self::FORM_MSG_RULE)
                ->addConditionOn($form['operation'], Form::EQUAL, \CalcManager::DIVIDE)
                ->addRule(FORM::PATTERN, 'Nelze dělit nulou.', '^[^0].*');
        $form->addSubmit('calculate', 'Spočítejvýsledek');
        $form->onSuccess[] = [$this, 'calculatorFormSucceeded'];
        return $form;
    }

    public function calculatorFormSucceeded($form, $values)
    {
        $this->result = $this->calculatorManager->calculate($values->operation, $values->x, $values->y);
    }


}
<?php


 /**
 * @package App\Model
 */
class CalcManager
{
    const
        ADD = 1,
        SUBTRACT = 2,
        MULTIPLY = 3,
        DIVIDE = 4;

    public function getOperations()
    {
        return array(
            self::ADD => 'Sčítání',
            self::SUBTRACT => 'Odčítání',
            self::MULTIPLY => 'Násobení',
            self::DIVIDE => 'Dělení'
        );
    }

    public function calculate($operation, $x, $y)
    {
        switch($operation)
        {
        case self::ADD:
            return $this->add($x,$y);
        case self::SUBTRACT:
            return $this->subtract($x,$y);
        case self::MULTIPLY:
            return $this->multiply($x,$y);
        case self::DIVIDE:
            return $this->divide($x,$y);
        default:
            return null;
        }
    }
    public function add($x, $y)
    {
        return $x + $y;
    }

    public function subtract($x, $y)
    {
        return $x - $y;
    }

    public function multiply($x, $y)
    {
        return $x*$y;
    }

    public function divide($x, $y)
    {
            return round($x/$y);
    }

}

PS: Ve formulářích bylo pár chyb, tak jsem poupravil ;)

Editoval Zuben45 (20. 12. 2015 23:01)

Jarik
Člen | 9
+
0
-

Ano měl…
Měl jsem registrovaný původní CalculatorManager jako service, abych mohl injectovat přes konstruktor.

Děkuji za všechny rady.