Multiple services of type App\CoreModule\Model\ArticleManager found: 01, 04

popcorn
Člen | 28
+
0
-

Ahoj, potřeboval bych odhalit, kde mám chybu. Háže mi to tento error: Service of type App\CoreModule\Presenters\ArticlePresenter: Multiple services of type App\CoreModule\Model\ArticleManager found: 01, 04 (needed by $articleManager in __construct())

ArticlePresenter mám:

<?php

namespace App\CoreModule\Presenters;

use App\CoreModule\Model\ArticleManager;
use App\Presenters\BasePresenter;
use Nette\Application\AbortException;
use Nette\Application\BadRequestException;
use Nette\Application\UI\Form;
use Nette\Database\UniqueConstraintViolationException;
use Nette\Utils\ArrayHash;

class ArticlePresenter extends BasePresenter
{
    private $defaultArticleUrl;
    private $articleManager;

    public function __construct($defaultArticleUrl, ArticleManager $articleManager)
    {
        parent::__construct();
        $this->defaultArticleUrl = $defaultArticleUrl;
        $this->articleManager = $articleManager;
    }

    public function renderDefault($url = null)
    {
        if (!$url) $url = $this->defaultArticleUrl;

        if (!($article = $this->articleManager->getArticle($url)))
            $this->error();

        $this->template->article = $article;
    }

    public function renderList()
    {
        $this->template->articles = $this->articleManager->getArticles();
    }

    public function actionRemove($url = null)
    {
        $this->articleManager->removeArticle($url);
        $this->flashMessage('Článek byl úspěšně odstraněn.');
        $this->redirect('Article:list');
    }

    public function actionEdtior($url = null)
    {
        if ($url) {

            if (!($article = $this->articleManager->getArticle($url)))
                $this->flashMessage('Článek nebyl nalezen.');
            else $this->editorForm->setDefaults($article);
        }
    }

    protected function createComponentEditorForm()
    {
        $form = new Form;
        $form->addHidden('article_id');
        $form->addText('title', 'Titulek')->setRequired();
        $form->addText('url', 'URL')->setRequired();
        $form->addText('description', 'Popisek')->setRequired();
        $form->addTextArea('content', 'Obsah');
        $form->addSubmit('save', 'Uložit článek');

        $form->onSuccess[] = function (Form $form, ArrayHash $values) {
            try {
                $this->articleManager->saveArticle($values);
                $this->flashMessage('Článek byl úspěšně uložen.');
                $this->redirect('Article:', $values->url);
            } catch (UniqueConstraintViolationException $e) {
                $this->flashMessage('Článek s touto URL adresou již existuje.');
            }
        };

        return $form;
    }
}
?>

ArticleManager:

<?php

namespace App\CoreModule\Model;

use App\Model\DatabaseManager;
use Nette\Database\Table\ActiveRow;
use Nette\Database\Table\Selection;
use Nette\Utils\ArrayHash;

class ArticleManager extends DatabaseManager
{
    const
        TABLE_NAME = 'article',
        COLUMN_ID = 'article_id',
        COLUMN_URL = 'url';

    public function getArticles()
    {
        return $this->database->table(self::TABLE_NAME)->order(self::COLUMN_ID . ' DESC');
    }

    public function getArticle($url)
    {
        return $this->database->table(self::TABLE_NAME)->where(self::COLUMN_URL, $url)->fetch();
    }

    public function saveArticle($article)
    {
        if (empty($article[self::COLUMN_ID])) {
            unset($article[self::COLUMN_ID]);
            $this->database->table(self::TABLE_NAME)->insert($article);
        } else
            $this->database->table(self::TABLE_NAME)->where(self::COLUMN_ID, $article[self::COLUMN_ID])->update($article);
    }

    public function removeArticle($url)
    {
        $this->database->table(self::TABLE_NAME)->where(self::COLUMN_URL, $url)->delete();
    }
}
?>

Editoval popcorn (25. 6. 2019 21:10)

MajklNajt
Člen | 502
+
+2
-

zrejme máš ArticleManager 2× v configu…

popcorn
Člen | 28
+
0
-

Nojo, měl jsi pravdu ^ Mohu se zeptat kdy se používá config App/config/common.neon a kdy App/config/local.neon?

David Matějka
Moderator | 6445
+
+4
-

Nette načítá oba tyto konfigurační soubory. do common.neon dáváš věci, které jsou společné pro celou aplikaci bez ohledu na to, kde běží. local.neon pak obvykle není verzovaný a máš v něm věci, které jsou specifické pro aktuální běh aplikace – tedy většinou různé údaje k databázi apod.

popcorn
Člen | 28
+
0
-

Super, děkuju mockrát! ;) Přeji hezký den.

Marek Bartoš
Nette Blogger | 1280
+
+1
-

Btw, nehledej v tom žádnou magii. Oba konfigurační soubory si přidáváš v app/bootstrap.php do Configuratoru sám. Myšlenka těch dvou souborů je taková, že v config.local.neon budeš mít jen konfiguraci specifickou pro lokální server (typicky údaje k databázi) s tím, že při deployi daný soubor nahradíš konfigurací pro server, na který nasazuješ. Strukturu konfiguračních údajů si jinak můžeš udělat jak chceš. Já třeba používám následující

/config
  /modules
    admin.neon
    front.neon
    console.neon
  /server
    local.neon
    production.neon
  base.neon

Editoval Mabar (29. 6. 2019 9:08)