Problém: Class App\Model\CalculatorManager used in service ‚25_App_Model_CalculatorManager‘ not found
- Jarik
- Člen | 9
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
Nejspíš máš třídu CalculatorManager zaregistrovanou v config.neon, ale v aplikaci ji nemáš (minimálně ji nevidí RobotLoader.
- Jarik
- Člen | 9
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
{
...
- Jarik
- Člen | 9
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)
- Zuben45
- Člen | 268
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
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
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)