Modulární aplikace – modely

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

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

    }
}
CZechBoY
Člen | 3608
+
0
-

Zkoušel si smazat cache?

use App\Modules\SMSModule\Models\SMSModel AS SMSModel;

není potřeba aliasování na stejný název…

dibi_dev vs dibi tom configu doporučuju přepsat do config.local.neon který k tomuhle slouží.

Carson
Člen | 35
+
0
-

@CZechBoY ano, cache jsem se pokoušel smazat – bez úspěchu. Na tomto testovacím serveru jsem rozjel již několik aplikací, ovšem né modulárních.

CZechBoY
Člen | 3608
+
0
-

Určitě RobotLoader načítá adresář s tou třídou?
Nemáš víc konfiguráků?

Carson
Člen | 35
+
0
-

@CZechBoY Mám pouze jeden konfigurační soubor. Kde zjistím, jestli mi robotloader bere i tento model?

Šaman
Člen | 2666
+
0
-
  • Jakou máš adresářovou strukturu? Ten RobotLoader bere defaultně vše v /app.
  • Model by neměl o modulech nic vědět. Model mívá jinou strukturu, než jakou vyžaduje prezentační vrstva. Třídy modelu bývají znovupoužitelné, což u tebe moc nebude už kvůli tomu namespace.
Carson
Člen | 35
+
0
-

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

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

@Š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;
Carson
Člen | 35
+
0
-

Nové informace, když odendám (@dibi.connection) a konstruktor v modelu, vše funguje…

David Matějka
Moderator | 6445
+
+3
-

mas tam totiz privatni konstruktor. to pak nejde trida inicializovat

Carson
Člen | 35
+
0
-

Ajo, to jsem přehlídnul :)… Díky moc @DavidMatějka a omlouvám se za zbytečné téma…

CZechBoY
Člen | 3608
+
+3
-

Tak jaktoze si psal ze ti jde trida instancovat rucne? To by nemelo jit, ne?