vložení try/catch bloku pro zachycení připojení k databázi
- flendry
- Člen | 5
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 | 661
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)