Service ‚tags‘: Class ‚Models\TagsModel‘ not found
- Patko
- Člen | 2
Ahojte, mám taký myslím že netradičný problém.
Tracy mi hlási chybu: Service ‚tags‘: Class ‚Models\TagsModel‘ not
found. search►
A však túto chybu hlási na všetkých nasledujúcich modeloch, divné je to
že tieto modely sú tam už vytvorené dlhšiu dobu a doteraz neboli žiadne
problémy.
Chyba sa preukázala až po tom ako som pridal nový model. Aj po jeho
odstránení mi chyba pretrváva.
Kolegom na Macoch môj kod funguje bez problémov, používame Docker.
Taktiež som už skúšal preinštalovať PHP, Composer a aj Docker. Premazal
som cache, a aj vytvoril nanovo celý Vendor.
Nič mi nepomohlo. Našiel som tu jedno téma ktorá rieši niečo podobné kde
údajne pomohlo len počkať a chyba sa sama opravila. Už čakám 3tí deň.
Momentálne tam už nemám novopridaný model.
Prikladám kód a printscreen callstacku.
common.neon:
services:
router: App\Router\RouterFactory::createRouter
cache: Nette\Caching\Cache
database: @Nette\Database\Connection
# passwords: Nette\Security\Passwords
translator: App\Localization\Translator
tags: Models\TagsModel
contents: Models\OtherContentsModel
users: Models\UsersModel
adminUsers: Models\AdminUsersModel
TagsModel.php
<?php
declare(strict_types=1);
namespace Models;
use Nette\Database\Context;
class TagsModel extends LinkableContentModel
{
/** @const string */
const TAG_TABLE = 'tags';
/** @var TagsCategories */
private $tagsCategories;
/** @var TagsMapTables */
private $tagsMapTables;
/**
* ContentsModel constructor.
* @param Context $database
*/
public function __construct(Context $database)
{
$this->tagsCategories = new TagsCategories();
$this->tagsMapTables = new TagsMapTables();
parent::__construct($database, self::TAG_TABLE);
}
/**
* @param int $tag_id
* @return \Nette\Database\IRow|null
*/
public function getTagNameById(int $tag_id){
return $this->database->query('
SELECT tag_name
FROM tags WHERE id = ?', $tag_id)
->fetch();
}
/**
* @return array
*/
public function getAllTagsPressnews():array{
return $this->database->table(self::TAG_TABLE)
->where('tag_category = ?', $this->tagsCategories::PRESSNEWS)
->order('tag_name ASC')
->fetchPairs('id', 'tag_name');
}
/**
* @param int $pressNewId
* @return array
*/
public function getPressNewTags(int $pressNewId):array{
return array_column($this->database->table($this->tagsMapTables::PRESSNEWS)
->where('pressnew_id = ?', $pressNewId)
->fetchAssoc('tag_id'), 'tag_id');
}
/**
* @param int $pressNewId
* @param int $tagId
* @return bool
*/
public function setTagsPressNews(int $pressNewId, int $tagId):bool{
return (bool)$this->database->table($this->tagsMapTables::PRESSNEWS)
->insert(['pressnew_id'=> $pressNewId, 'tag_id' => $tagId]);
}
/**
* @param int $pressNewId
* @return bool
*/
public function deleteTagsPressNew(int $pressNewId):bool{
return (bool)$this->database->table($this->tagsMapTables::PRESSNEWS)
->where('pressnew_id = ?', $pressNewId)
->delete();
}
}
class TagsCategories
{
/** @const string */
const PRESSNEWS = 'pressnews';
}
class TagsMapTables
{
/** @const string */
const PRESSNEWS = 'pressnew_tag_map';
}
Ďakujem
- Marek Bartoš
- Nette Blogger | 1280
Zkus přidat tento snippet do composer.json a spustit
composer dump
. Jestli se ti třída načte, tak je špatně
autoloading, autoloader nedohledává službu. Vyžaduje to sice command spustit
při přidání každé třídy, ale aspoň se pohneš dál :)
"autoload": {
"classmap": ["app"]
},
Nevím, zda je chyba v autoloaderu, windows dockeru či něčem jiném, ale imho je nejlepší prostě používat PSR-4 autoloader Composeru.
"autoload": {
"psr-4": {
"App\\": "app"
}
},
Pak stačí například přes PHP CodeSniffer vynutit, aby názvy tříd odpovídaly názvům souborů podle PSR-4
<!-- Configure PSR-4 rule -->
<rule ref="SlevomatCodingStandard.Files.TypeNameMatchesFileName">
<properties>
<property name="rootNamespaces" type="array">
<element key="app" value="App"/>
<element key="tests" value="Tests\App"/>
</property>
</properties>
</rule>
- Patko
- Člen | 2
Marek Bartoš napsal(a):
Zkus přidat tento snippet do composer.json a spustit
composer dump
. Jestli se ti třída načte, tak je špatně autoloading, autoloader nedohledává službu. Vyžaduje to sice command spustit při přidání každé třídy, ale aspoň se pohneš dál :)"autoload": { "classmap": ["app"] },
Nevím, zda je chyba v autoloaderu, windows dockeru či něčem jiném, ale imho je nejlepší prostě používat PSR-4 autoloader Composeru.
"autoload": { "psr-4": { "App\\": "app" } },
Pak stačí například přes PHP CodeSniffer vynutit, aby názvy tříd odpovídaly názvům souborů podle PSR-4
<!-- Configure PSR-4 rule --> <rule ref="SlevomatCodingStandard.Files.TypeNameMatchesFileName"> <properties> <property name="rootNamespaces" type="array"> <element key="app" value="App"/> <element key="tests" value="Tests\App"/> </property> </properties> </rule>
Pomohlo mi toto.
Ďakujem velmi pekne.
"autoload": {
"classmap": ["app"]
},