vložení try/catch bloku pro zachycení připojení k databázi

flendry
Člen | 5
+
0
-

Ahoj,
vytvářím CMS a jednou z částí je nastavení připojení k databázi. Po nahrání souborů na hosting se zobrazí chyba – server error. Je to z důvodu, že ještě nebylo nastaveno připojení k databázi, které se vytváří na URL/install. potřebuji tuto chybu zachytit a v případě, že nebylo nastaveno připojení uživatele přesměrovat na instalační stránku.

Používám Doctrine2 mapování, které je v config.neon načteno pomocí třídy, která do konfigurace vrací přístupové údaje. V případě, že tam ještě nejsou, vyhodí chybu.

Chyba je ale vyhazována až ve chvíli, kdy je potřeba nějaká data získat, a to je v module, v jedné ze service, která se stará o entitu namapovanou pomocí ORM. Všechno ale předávám (injectuji) v konstruktoru. I v Preseteru. Takže když bych dal try/catch do konstruktoru, chybu nevyřeším, protože nejprve se načítají data v module a ty jsou předána do konstruktoru, který je přiřazuje proměnným v presenteru. Pomocí /** @var /App/Modules… @inject */ se mi to vyřešit nepodařilo.

výsledkem má být, že pokud není nastaveno připojení k DB, automaticky je z Homepage: přesměrováno na Install

chyba:

Doctrine\DBAL\Exception\ConnectionException

An exception occured in driver: SQLSTATE[HY000] [1045] Access denied for user ''@'localhost' (using password: NO)

¨HomePagePresenter:

<?php

namespace App\FrontModule\Presenters;

use Nette;
use App\Model\BlockFactory as BF;



class HomepagePresenter  extends BasePresenter
{


	private $blockFactory;

	private $blocks;
	private $menu;
	private $seo;

	public function __construct(BF $blockFactory)
	{
		$this->blockFactory = $blockFactory;

		$this->blocks = $blockFactory->getAllBlocks();
		$this->menu = $blockFactory->getBlockMenus()->getOne();
		$this->seo = $blockFactory->getBlockSeo()->getOne();
	}

    public function renderDefault(){
		$this->template->blocks = $this->blocks;
		$this->template->menu = $this->menu;

		$this->template->keywords = $this->seo->getKeywords();
		$this->template->description = $this->seo->getDescription();
		$this->template->favicon = $this->seo->getFavicon();
    }

}

BlockFactory:

<?php
/**
 * Created by PhpStorm.
 * User: Kuba
 * Date: 13.3.2018
 * Time: 13:08
 */

namespace App\Model;

use Nette;
use Kdyby\Doctrine\EntityManager;

use App\Model\Services\ReferenceService;
use App\Model\Services\MemberService;
use App\Model\Services\HeaderService;
use App\Model\Services\EventService;
use App\Model\Services\ContactService;
use App\Model\Services\ArticleService;
use App\Model\Services\SponsorService;

use App\Model\Services\MenuService;
use App\Model\Services\SeoService;


class BlockFactory
{
	/**
	 * @var EntityManager
	 */
	private $entityManager;

    private $references;
    private $members;
    private $headers;
    private $events;
    private $contacts;
    private $articles;
    private $sponsors;

    private $menu;
    private $seo;


    public function __construct(
    	EntityManager $entityManager,
        ReferenceService $references,
        MemberService $members,
        HeaderService $headers,
        EventService $events,
        ContactService $contacts,
        ArticleService $articles,
        SponsorService $sponsors,

        MenuService $menu,
        SeoService $seo
    )
    {
	    $this->entityManager = $entityManager;

        $this->references = $references;
        $this->members = $members;
        $this->headers = $headers;
        $this->events = $events;
        $this->contacts = $contacts;
        $this->articles = $articles;
        $this->sponsors = $sponsors;

        $this->menu = $menu;
        $this->seo = $seo;
    }





}

MemberService:

<?php
/**
 * Created by PhpStorm.
 * User: Kuba
 * Date: 18.3.2018
 * Time: 19:14
 */
namespace App\Model\Services;

use App\Model\Entities\BlockMembers;
use App\Model\Entities\Member;
use Kdyby\Doctrine\EntityManager;

class MemberService
{

    /**
     * @var EntityManager
     */
    private $entityManager;

    /**
     * @var EntityManager
     */
    private $entities;

    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
        $this->entities = $this->entityManager->getRepository(BlockMembers::class);
    }

    public function newEntity(){
        $entity = new BlockMembers;
        return $entity;
    }

    public function saveEntity($entity){
        $this->entityManager->persist($entity);
        $this->entityManager->flush();
    }

    public function createEntity($style, $bgType, $image, $position, $active, $heading)
    {
        $entity = new BlockMembers;
        $entity->setStyle($style);
        $entity->setBgType($bgType);
        $entity->setImage($image);
        $entity->setPosition($position);
        $entity->setActive($active);
        $entity->setHeading($heading);

        $this->entityManager->persist($entity);
        $this->entityManager->flush();
    }

    public function newSubEntity($blockId){
        $blockId = intval($blockId);
        $entity = new Member();
        $this->findById($blockId)->setMember($entity);
        return $entity;
    }

    public function createSubEntity($id){
        $entity = $this->entityManager->findById($id)->createEntity();
        $this->entityManager->persist($entity);
        $this->entityManager->flush();
    }

    public function delete($id){
        $toDel = $this->findById($id);
        $toDel->getMembers()->map(function(Member $el){
            $el->deleteImage();
        });
        $toDel->deleteImage();
        $this->entityManager->remove($toDel);
        $this->entityManager->flush();
    }

    public function deleteMember($blockId, $id){
        $toDel = $this->findById($blockId)->removeMember($this->findSubById($blockId, $id));
        $toDel->deleteImage();
        $this->entityManager->remove($toDel);
        $this->entityManager->flush();
    }

    public function findByVar($var, $val) {
        return $this->entities->findOneBy(array($var => $val));
    }

    public function findById($val) {
        return $this->entities->findOneBy(array('id' => $val));
    }

    public function getEntities() {
        return $this->entities->findAll();
    }

    public function findSubById($blockId, $subId){
        return $this->findById($blockId)->findById($subId);

    }

}

chyba je vyhazována na řádku 96 přímo v MemberService:
je to vyhozena zrovna v této, protože je jako první uvedena v konstruktoru BlockFactory, kdybych je prohodil, chyba bude obdobná.

public function getEntities() {
 96:            return $this->entities->findAll();
}
Martk
Člen | 651
+
0
-

Lepší bude, když budeš kontrolovat, jsou-li parametry nastaveny přes connection:

$entityManager->getConnection()->getHost() !== null && $entityManager->getConnection()->getPassword() !== null

nebo ještě lépe mít nějakou konstantu, která označuje, zda je to nainstalované. Přes instalátor bude stačit přepsat jen soubor.

Editoval Martk (2. 6. 2018 18:41)

CZechBoY
Člen | 3608
+
+2
-

Asi bych si v bootstrapu kontroloval jestli existuje/je validní soubor config.local.neon (nebo kam potom ukládáš konfiguraci instalace). Pokud soubor neexistuje/je nevalidní tak bych uživatele přesměroval na url instalace.

flendry
Člen | 5
+
0
-

Moc dík, nacpal jsem to do bootstrapu a funguje to naprosto přesně, jak potřebuji.