Modulární aplikace – modely
- Carson
- Člen | 35
Ahoj,
Již se od včerejšího večera trápím s modulární aplikací. Ať se snažím jak chci, nemohu si předat model do presenteru, protože mi to hlásí, že model neexistuje. Na model vidím v pořádku ze strany PHP stormu. Namespace mám také správně. Odkazy a vše ostatní mi funguje již v pořádku. Routování jsem si upravil tak, aby fungovalo.
Chyba kterou to hlásí **Class App\Modules\SMSModule\Models\SMSModel used in service ‚SMSModel‘ not found or is not instantiable. **
Strukturu mám takovou
App
Modules
MainModule
Presenters
Models
Templates
AuthModule
...
SMSModule
...
Config neon
# WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
# https://nette.org/en/security-warning
parameters:
php:
date.timezone: Europe/Prague
extensions:
dibi: Dibi\Bridges\Nette\DibiExtension22
dibi_dev: Dibi\Bridges\Nette\DibiExtension22
dibi:
host: xxx
username: xxx
password: xxx
driver: postgre
database: xxx
lazy: TRUE
autowired: false
dibi_dev:
host: xxx
username: xxx
password: xxx
driver: postgre
database: xxx
lazy: TRUE
autowired: false
application:
errorPresenter: Error
mapping:
*: App\Modules\*Module\Presenters\*Presenter
session:
expiration: 14 days
services:
router: App\RouterFactory::createRouter
SMSModel: App\Modules\SMSModule\Models\SMSModel(@dibi.connection)
SMSPreenter
<?php
namespace App\Modules\SMSModule\Presenters;
/**
* Created by PhpStorm.
* User: skill
* Date: 29.02.2016
* Time: 11:53
*/
use App\Modules\SMSModule\Models\SMSModel AS SMSModel;
use Nette;
class SMSPresenter extends \App\Modules\MainModule\BasePresenter
{
private $SMSModel;
public function __construct(SMSModel $SMSModel)
{
$this->SMSModel = $SMSModel;
}
public function renderLocality()
{
$this->template->Locality = $this->SMSModel->getLocality();
}
}
SMSModel
<?php
/**
* Created by PhpStorm.
* User: skill
* Date: 29.02.2016
* Time: 12:09
*/
namespace App\Modules\SMSModule\Models;
class SMSModel extends \Nette\Object
{
private $Db;
private function __construct(\DibiConnection $Db)
{
$this->Db = $Db;
}
public function getLocality()
{
}
}
- Carson
- Člen | 35
Celá struktura projektu je tato:
├── app
│ ├── config
│ └── Modules
│ ├── AuthModule
│ │ ├── models
│ │ ├── presenters
│ │ └── templates
│ ├── MainModule
│ │ ├── models
│ │ ├── presenters
│ │ └── templates
│ │ └── Main
│ └── SMSModule
│ ├── models
│ ├── presenters
│ └── templates
├── log
├── temp
│ └── cache
│ ├── latte
│ ├── Nette.Configurator
│ ├── _Nette.RobotLoader
│ └── Nov\303\275\ adres\303\241\305\231
│ ├── Nette.Configurator
│ └── _Nette.RobotLoader
├── vendor
│ ├── bin
│ ├── composer
│ ├── dibi
| | ...
└── www
├── css
├── fonts
└── js
Co se týče znovupoužitelnoti modelů, mám projekt koncipovaný tak, aby vždy model náležel pouze do modulu, ve kterém je daný. Model, který budu chtít použít všude dám nad moduly.
Editoval Carson (29. 2. 2016 16:56)
- Šaman
- Člen | 2666
Divný, tohle by RobotLoader měl vidět. Zkontroluj si to v bootstrapu.
Ještě si zkontroluj, jestli jde instancovat (pomocí operátoru
new
).
- Carson
- Člen | 35
@Šaman Ano, instanci třídy lze vytvořit přes new.
můj boostrap.php
<?php
require __DIR__ . '/../vendor/autoload.php';
$configurator = new Nette\Configurator;
$configurator->setDebugMode(TRUE); // enable for your remote IP
$configurator->enableDebugger(__DIR__ . '/../log');
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
$configurator->addConfig(__DIR__ . '/config/config.neon');
$container = $configurator->createContainer();
return $container;