Service ‚tags‘: Class ‚Models\TagsModel‘ not found

Patko
Člen | 2
+
0
-

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.

https://prntscr.com/26jgxkk

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 | 1146
+
+1
-

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

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"]
	},