Skip to content
Permalink
Browse files

added PHP 7.1 typehint void

  • Loading branch information...
dg committed Oct 5, 2018
1 parent c4a7c65 commit 17893e44cd537fea2dba528157d5e55033138b93
@@ -409,7 +409,7 @@ a v presenterech pak můžete ověřit práva například v metodě startup:


/--php
protected function startup()
protected function startup(): void
{
parent::startup();
if (!$this->getUser()->isAllowed('backend')) {
@@ -471,7 +471,7 @@ $user->getStorage()->setNamespace('backend');

Je důležité pamatovat na to, abychom jmenný prostor nastavili vždy na všech místech patřících do dané části. Pakliže používáme [presentery |presenters], nastavíme jmenný prostor ve společném předkovi pro danou část - obvykle BasePresenter. Učiníme tak rozšířením metody [checkRequirements() |api:Nette\Application\UI\Presenter::checkRequirements()]:
/--php
public function checkRequirements($element)
public function checkRequirements($element): void
{
$this->getUser()->getStorage()->setNamespace('backend');
parent::checkRequirements($element);
@@ -19,7 +19,7 @@ Nette neobsahuje implementaci AJAX požadavků na straně klienta. Doporučujeme
Pro odesílání dat prohlížeči ve formátu JSON lze využít předpřipravený objekt `payload`:

/--php
public function actionDelete(int $id)
public function actionDelete(int $id): void
{
if ($this->isAjax()) {
$this->payload->message = 'Success';
@@ -37,7 +37,7 @@ Pokud potřebujete plnou kontrolu nad odeslaným JSONem, použijte v presenteru
Když chceme odeslat HTML, můžeme jednak zvolit speciální šablonu pro AJAX:

/--php
public function handleClick($param)
public function handleClick($param): void
{
if ($this->isAjax()) {
$this->template->setFile('path/to/ajax.latte');
@@ -57,7 +57,7 @@ Invalidace
Každý objekt třídy [Control |components] (což je i samotný Presenter) si umí zapamatovat, jestli při subrequestu došlo ke změnám, které si vyžadují jej překreslit. K tomu slouží dvojice metod `redrawControl()` a `isControlInvalid()`. Příklad:

/--php
public function handleLogin(string $user)
public function handleLogin(string $user): void
{
// po přihlášení uživatele se musí objekt překreslit
$this->redrawControl();
@@ -146,14 +146,14 @@ class HomepagePresenter extends Nette\Application\UI\Presenter
];
}

public function renderDefault()
public function renderDefault(): void
{
if (!isset($this->template->list)) {
$this->template->list = $this->getTheWholeList();
}
}

public function handleUpdate(int $id)
public function handleUpdate(int $id): void
{
$this->template->list = $this->isAjax()
? []
@@ -210,7 +210,7 @@ V takovém případě je nejjednodušší celý ten seznam obalit ještě jední
\--

/--php
public function handleAdd()
public function handleAdd(): void
{
$this->template->list = $this->getTheWholeList();
$this->template->list[] = 'New one';
@@ -239,7 +239,7 @@ $.getJSON(
A handle metoda s odpovídajícími parametry v komponentě.

/--php
public function handleChangeCountBasket(int $id, int $count)
public function handleChangeCountBasket(int $id, int $count): void
{

}
@@ -275,7 +275,7 @@ class MyPresenter
$this->storage = $storage;
}

public function actionDefault()
public function actionDefault(): void
{
$cache = new Nette\Caching\Cache($this->storage, 'htmlFront');
$cache->save($key, $data);
@@ -34,7 +34,7 @@ Bavíme-li se o komponentách, obvykle myslíme potomky třídy [Control |api:Ne
Komponenta obsahuje továrnu na svou [šablonu |latte:]. Ta standardně vytvoří šablonu, předá ji některé základní proměnné a zaregistruje [standardní filtry |latte:filters]. O vykreslení se už musíme postarat sami, a to v metodě `render()`. Tam také musíme určit soubor, ze kterého bude šablona načtena, a zaregistrovat proměnné, které se budou v šabloně používat. Šablonu můžeme umístit do stejné složky a pod stejným názvem jako komponentu:

/--php
public function render()
public function render(): void
{
// vložíme do šablony nějaké parametry
$this->template->param = $value;
@@ -84,7 +84,7 @@ Zasílání obstarává metoda [flashMessage |api:Nette\Application\UI\Control::

Příklad:
/--php
public function deleteFormSubmitted(Nette\Application\UI\Form $form)
public function deleteFormSubmitted(Nette\Application\UI\Form $form): void
{
// ... požádáme model o smazání záznamu ...

@@ -120,7 +120,7 @@ Jinými slovy: vezme se definice funkce `handle{signal}` a všechny parametry, k
Ukázka zpracování signálu:

/--php
public function handleClick(int $x, int $y)
public function handleClick(int $x, int $y): void
{
if (!$this->isClickable($x, $y)) {
throw new Nette\Application\UI\BadSignalException('Action not allowed.');
@@ -218,7 +218,7 @@ class PollControl extends Control
$this->pollId = $pollId;
}

public function handleVote(int $voteId)
public function handleVote(int $voteId): void
{
$this->pollManager->vote($pollId, $voteId);
//...
@@ -413,7 +413,7 @@ class UploadControl extends Nette\Forms\Controls\BaseControl
{
public function __construct($label)
{
$this->monitor(Nette\Forms\Form::class, function ($form) {
$this->monitor(Nette\Forms\Form::class, function ($form): void {
$form->getElementPrototype()->enctype = 'multipart/form-data';
});
// ...
@@ -54,7 +54,7 @@ class MyService
/** @var AnotherService */
private $anotherService;

public function setAnotherService(AnotherService $service)
public function setAnotherService(AnotherService $service): void
{
$this->anotherService = $service;
}
@@ -88,7 +88,7 @@ class MyService
/** @var AnotherService */
private $anotherService;

public function injectAnotherService(AnotherService $service)
public function injectAnotherService(AnotherService $service): void
{
$this->anotherService = $service;
}
@@ -152,7 +152,7 @@ class MyPresenter extends Nette\Application\UI\Presenter
// 2) Předání metodou inject*:
private $service2;

public function injectService2(Service2 $service)
public function injectService2(Service2 $service): void
{
$this->service2 = $service;
}
@@ -190,7 +190,7 @@ class MyControl extends Nette\Application\UI\Control
// 2) Předání setterem:
private $service2;

public function setService2(Service2 $service)
public function setService2(Service2 $service): void
{
$this->service2 = $service;
}
@@ -300,7 +300,7 @@ class Service2
{
private $anotherService;

public function setAnotherService(AnotherService $service)
public function setAnotherService(AnotherService $service): void
{
$this->anotherService = $service;
}
@@ -326,7 +326,7 @@ class Service3
// 1) Metoda inject*:
private $service1;

public function injectService1(Service1 $service)
public function injectService1(Service1 $service): void
{
$this->service1 = $service1;
}
@@ -141,7 +141,7 @@ protected function createComponentSignInForm(): Form
return $form;
}

public function validateSignInForm(Form $form)
public function validateSignInForm(Form $form): void
{
$values = $form->getValues();

@@ -37,7 +37,7 @@ class HomepagePresenter extends UI\Presenter
}

// volá se po úspěšném odeslání formuláře
public function registrationFormSucceeded(UI\Form $form, \stdClass $values)
public function registrationFormSucceeded(UI\Form $form, \stdClass $values): void
{
// ...
$this->flashMessage('Byl jste úspěšně registrován.');
@@ -345,7 +345,7 @@ class SignInFormFactory
...
$form->addSubmit('login', 'Přihlásit se');

$form->onSuccess[] = function (Form $form, \stdClass $values) {
$form->onSuccess[] = function (Form $form, \stdClass $values): void {
// zde provedeme zpracování formuláře
};

@@ -51,7 +51,7 @@ Překlad šablon
Šabloně lze také nastavit překladač metodou `setTranslator()`, například v presenteru:

/--php
protected function beforeRender()
protected function beforeRender(): void
{
...
$this->template->setTranslator($translator);
@@ -136,7 +136,7 @@ class MailSender
/** @var Nette\Application\UI\ITemplateFactory */
private $templateFactory;

public function sendEmail()
public function sendEmail(): void
{
$template = $this->createTemplate();

@@ -55,7 +55,7 @@ class HomepagePresenter extends Nette\Application\UI\Presenter
$this->articleRepository = $articleRepository;
}

public function renderDefault()
public function renderDefault(): void
{
$this->template->articles = $this->articleRepository->findPublishedArticles();
}
@@ -143,7 +143,7 @@ class HomepagePresenter extends Nette\Application\UI\Presenter
$this->articleRepository = $articleRepository;
}

public function renderDefault(int $page = 1)
public function renderDefault(int $page = 1): void
{
// Zjistíme si celkový počet publikovaných článků
$articlesCount = $this->articleRepository->getPublishedArticlesCount();
@@ -249,7 +249,7 @@ class HomepagePresenter extends Nette\Application\UI\Presenter
$this->articleRepository = $articleRepository;
}

public function renderDefault(int $page = 1)
public function renderDefault(int $page = 1): void
{
// Vytáhneme si publikované články
$articles = $this->articleRepository->findPublishedArticles();
@@ -98,7 +98,7 @@ Presenter je objekt, který vezme požadavek přeložený routerem a vymyslí od
/--php
class ProductPresenter extends Nette\Application\UI\Presenter
{
public function renderShow(int $id)
public function renderShow(int $id): void
{
// získáme data z modelu a předáme do šablony
$this->template->product = $this->productRepository->getProduct($id);
@@ -435,7 +435,7 @@ Presenter můžeme během jeho životního cyklu kdykoliv ukončit a odeslat jin
Příklad odeslání JSONu:

/--php
public function actionData()
public function actionData(): void
{
$data = ['hello' => 'nette'];
$this->sendJson($data);
@@ -497,7 +497,7 @@ Chyba 404 a spol.
Pokud nemůžeme splnit požadavek z důvodu, že například záznam neexistuje v databázi, vyhodíme metodou `error()` výjimku `Nette\Application\BadRequestException`, která představuje HTTP chybu 404:

/--php
public function renderShow(int $id)
public function renderShow(int $id): void
{
$product = $this->productRepository->getProduct($id);
if (!$product) {
@@ -519,7 +519,7 @@ Jde o zprávy obvykle informující o výsledku nějaké operace. Důležitým r
Stačí zavolat metodu [flashMessage() |api:Nette\Application\UI\Control::flashMessage()] a o předání do šablony se postará presenter. Prvním parametrem je text zprávy a nepovinným druhým parametrem její typ (error, warning, info apod.). Metoda `flashMessage()` vrací instanci flash zprávy, které je možné přidávat další informace.

/--php
public function deleteFormSubmitted()
public function deleteFormSubmitted(): void
{
// ... požádáme model o smazání záznamu ...

@@ -555,7 +555,7 @@ class ArticlePresenter extends Nette\Application\UI\Presenter
$this->articles = $articles;
}

public function renderShow(int $id)
public function renderShow(int $id): void
{
$this->template->article = $this->articles->find($id);
}
@@ -599,7 +599,7 @@ Továrna na komponenty představuje elegantní způsob, jak komponenty vytváře
/--php
class DefaultPresenter extends Nette\Application\UI\Presenter
{
public function renderDefault()
public function renderDefault(): void
{
$menu = $this['menu']; // přistoupíme ke komponentě
// a pokud to bylo poprvé, zavolá se createComponentMenu()
@@ -82,7 +82,7 @@ Dále doplníme callback pro přihlášení uživatele, který bude volán hned
Callback pouze převezme uživatelské jméno a heslo, které uživatel vyplnil a předá to authenticatoru. Po přihlášení přesměrujeme na úvodní stránku.

/--php
public function signInFormSucceeded(Form $form, \stdClass $values)
public function signInFormSucceeded(Form $form, \stdClass $values): void
{
try {
$this->getUser()->login($values->username, $values->password);
@@ -112,7 +112,7 @@ Prvně zabezpečíme formulář pro přidávání nových příspěvků. Ten je
Vytvoříme action metodu `actionCreate`, která přesměruje nepřihlášené uživatele na formulář s přihlášením.

/--php
public function actionCreate()
public function actionCreate(): void
{
if (!$this->getUser()->isLoggedIn()) {
$this->redirect('Sign:in');
@@ -123,7 +123,7 @@ Vytvoříme action metodu `actionCreate`, která přesměruje nepřihlášené u
Stejným způsobem zabezpečíme i editovací stránku, takže jednoduše přidáme tyto tři řádky také sem:

/--php
public function actionEdit(int $postId)
public function actionEdit(int $postId): void
{
if (!$this->getUser()->isLoggedIn()) {
$this->redirect('Sign:in');
@@ -159,7 +159,7 @@ Poslední a **nejdůležitější věc** je **zabezpečit callbacky formulářů
Tomu můžeme zabránit přidáním jednoduchého *if*, který přidáme na začátek metody `postFormSucceeded`:

/--php
public function postFormSucceeded(Form $form, \stdClass $values)
public function postFormSucceeded(Form $form, \stdClass $values): void
{
if (!$this->getUser()->isLoggedIn()) {
$this->error('Pro vytvoření, nebo editování příspěvku se musíte přihlásit.');
@@ -190,7 +190,7 @@ Pokud není uživatel přihlášen, zobrazí se odkaz "Přihlásit". V opačném
Jelikož uživatele po odhlášení okamžitě přesměrujeme, není potřeba žádná šablona. Odhlášení vypadá takto:

/--php
public function actionOut()
public function actionOut(): void
{
$this->getUser()->logout();
$this->flashMessage('Odhlášení bylo úspěšné.');
@@ -92,7 +92,7 @@ $form->onSuccess[] = [$this, 'commentFormSucceeded'];
Předchozí zápis znamená "po úspěšném odeslání formuláře zavolej metodu `commentFormSucceeded` ze současného presenteru". Tato metoda však ještě neexistuje, pojďme ji tedy vytvořit.

/--php
public function commentFormSucceeded(Form $form, \stdClass $values)
public function commentFormSucceeded(Form $form, \stdClass $values): void
{
$postId = $this->getParameter('postId');

@@ -133,7 +133,7 @@ Nette Database Explorer používá cizí klíče pro vyřešení vzájemného vz
Jak si jistě pamatujete, do šablony jsme předali proměnnou `$post` pomocí metody `PostPresenter::renderShow()` a nyní chceme iterovat přes všechny komentáře, které mají hodnotu sloupce `post_id` shodnou s `$post->id`. Toho můžeme docílit voláním `$post->related('comments')`. Ano, takhle jednoduše. Podívejme se na výsledný kód:

/--php
public function renderShow(int $postId)
public function renderShow(int $postId): void
{
...
$this->template->post = $post;
Oops, something went wrong.

0 comments on commit 17893e4

Please sign in to comment.
You can’t perform that action at this time.