Permalink
Browse files

lots of fixes (#706)

* Docs: synchronize injects in presenters, synchronize method and property visibility, synchronize namespaces, etc

* ArrayHash -> stdClass

* Composer drop PHP 7.2 recommendation

* PostModel -> FooModel

* Typos
  • Loading branch information...
f3l1x authored and dg committed Oct 5, 2018
1 parent cda6053 commit e6057d6e06a042e6410320677ec2dc5b1e3c5698
@@ -102,32 +102,30 @@ Vlastní autentikátor
Napíšeme si vlastní autentikátor, který bude ověřovat přihlašovací údaje oproti databázové tabulce. Každý autentikátor je implementací rozhraní [api:Nette\Security\IAuthenticator] mající jedinou metodu `authenticate()`. Jejím úkolem je buď vrátit tzv. [identitu |#identita] nebo vyhodit výjimku `Nette\Security\AuthenticationException`. Framework definuje i několik chybových kódů, které můžeme využít k formálnímu popisu vzniklé chyby (např. `IAuthenticator::IDENTITY_NOT_FOUND` nebo `IAuthenticator::INVALID_CREDENTIAL`.)

/--php
use Nette\Security as NS;

class MyAuthenticator implements NS\IAuthenticator
{
public $database;
private $database;

function __construct(Nette\Database\Context $database)
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}

function authenticate(array $credentials)
public function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$row = $this->database->table('users')
->where('username', $username)->fetch();

if (!$row) {
throw new NS\AuthenticationException('User not found.');
throw new Nette\Security\AuthenticationException('User not found.');
}

if (!NS\Passwords::verify($password, $row->password)) {
throw new NS\AuthenticationException('Invalid password.');
if (!Nette\Security\Passwords::verify($password, $row->password)) {
throw new Nette\Security\AuthenticationException('Invalid password.');
}

return new NS\Identity($row->id, $row->role, ['username' => $row->username]);
return new Nette\Security\Identity($row->id, $row->role, ['username' => $row->username]);
}
}
\--
@@ -217,7 +215,7 @@ Rámcová podoba implementace vypadá takto:
/--php
class MyAuthorizator implements Nette\Security\IAuthorizator
{
function isAllowed($role, $resource, $privilege)
public function isAllowed($role, $resource, $privilege)
{
return ...; // vrací true nebo false
}
@@ -411,7 +409,6 @@ a v presenterech pak můžete ověřit práva například v metodě startup:


/--php

protected function startup()
{
parent::startup();
@@ -424,8 +421,6 @@ a v presenterech pak můžete ověřit práva například v metodě startup:
Alternativou k nastavení v souboru `config.neon` je vytvoření továrny, která nám Permission nastaví. Ta pak může vypadat například následovně:

/--php
<?php

namespace App\Model;

class AuthorizatorFactory
@@ -500,8 +495,13 @@ services:
/--php
class SignPresenter extends Nette\Application\UI\Presenter
{
/** @var FrontAuthenticator @inject */
public $authenticator;
/** @var FrontAuthenticator */
private $authenticator;

public function __construct(FrontAuthenticator $authenticator)
{
$this->authenticator = $authenticator;
}
}
\--

@@ -131,7 +131,7 @@ Dynamické snippety nelze invalidovat přímo (invalidace `item-1` neudělá vů
V příkladu výše zkrátka musíte zajistit, aby při ajaxovém požadavku byla v proměnné `$list` pouze jedna položka a tedy aby ten cyklus `foreach` naplnil pouze jeden dynamický snippet:

/--php
class HomepagePresenter extends \Nette\Application\UI\Presenter
class HomepagePresenter extends Nette\Application\UI\Presenter
{
/**
* Zde je nějaká logika pro získání celého seznamu. Správně to patří do
@@ -268,15 +268,17 @@ use Nette;

class MyPresenter
{
/**
* @inject
* @var Nette\Caching\IStorage
*/
public $storage;
/** @var Nette\Caching\IStorage */
private $storage;

public function __construct(Nette\Caching\IStorage $storage)
{
$this->storage = $storage;
}

public function actionDefault()
{
$cache = new Cache($this->storage, 'htmlFront');
$cache = new Nette\Caching\Cache($this->storage, 'htmlFront');
$cache->save($key, $data);
}
}
@@ -36,12 +36,10 @@ Komponenta obsahuje továrnu na svou [šablonu |latte:]. Ta standardně vytvoř
/--php
public function render()
{
$template = $this->template;
$template->setFile(__DIR__ . '/poll.latte');
// vložíme do šablony nějaké parametry
$template->param = $value;
$this->template->param = $value;
// a vykreslíme ji
$template->render();
$this->template->render(__DIR__ . '/poll.latte');
}
\--

@@ -86,7 +84,7 @@ Zasílání obstarává metoda [flashMessage |api:Nette\Application\UI\Control::

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

@@ -208,14 +206,10 @@ Co když ale naše komponenta potřebuje nějaké věci k tomu aby fungovala, t
/--php
class PollControl extends Control
{
/**
* @var App\Model\PollManager
*/
/** @var App\Model\PollManager */
private $pollManager;

/**
* @var int Id ankety pro kterou vytváříme komponentu
*/
/** @var int Id ankety pro kterou vytváříme komponentu */
private $pollId;

public function __construct($pollId, PollManager $pollManager)
@@ -237,9 +231,7 @@ No jo, ale jak se to do toho konstruktoru dostane? Na to si napíšeme továrnu,
/--php
class PollControlFactory
{
/**
* @var PollManager
*/
/** @var PollManager */
private $pollManager;

public function __construct(PollManager $pollManager)
@@ -267,11 +259,9 @@ services:
a nakonec ji použijeme v našem presenteru:

/--php
class PollPresenter extends \Nette\UI\Application\Presenter
class PollPresenter extends Nette\UI\Application\Presenter
{
/**
* @var PollControlFactory
*/
/** @var PollControlFactory */
private $pollControlFactory;

public function __construct(PollControlFactory $pollControlFactory)
@@ -107,7 +107,7 @@ Další způsob specifický pro DI Container v Nette. Jedná se o zvláštní p
/--php
class MyService
{
/** @var \App\AnotherService @inject */
/** @var AnotherService @inject */
public $anotherService;
}
\--
@@ -158,7 +158,7 @@ class MyPresenter extends Nette\Application\UI\Presenter
}

// 3) Předání do proměnné s anotací @inject:
/** @var \App\Service3 @inject */
/** @var Service3 @inject */
public $service3;
}
\--
@@ -203,10 +203,10 @@ Její použití v presenteru by vypadalo následovně:
/--php
class MyPresenter extends Nette\Application\UI\Presenter
{
/** @var \App\Service1 @inject */
/** @var Service1 @inject */
public $service1;

/** @var \App\Service2 @inject */
/** @var Service2 @inject */
public $service2;

protected function createComponentMyControl()
@@ -328,7 +328,7 @@ class Service3
}

// 2) Přiřazení do proměnné s anotací @inject:
/** @var \App\Service2 @inject */
/** @var Service2 @inject */
public $service2;
}
\--
@@ -123,7 +123,7 @@ Formuláře lze vykreslovat i ručně a tím získat větší kontrolu nad kóde
Velmi snadno také můžete propojit formulář s existující šablonou. Stačí jen doplnit atributy n:name:

/--php
function createComponentSignInForm()
protected function createComponentSignInForm()
{
$form = new Form;
$form->addText('user')->setRequired();
@@ -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, $values)
public function registrationFormSucceeded(UI\Form $form, stdClass $values)
{
// ...
$this->flashMessage('Byl jste úspěšně registrován.');
@@ -54,11 +54,11 @@ Překlad šablon
Šabloně lze také nastavit překladač metodou `setTranslator()`, například v presenteru:

/--php
function beforeRender()
{
...
$this->template->setTranslator($translator);
}
protected function beforeRender()
{
...
$this->template->setTranslator($translator);
}
\--


@@ -140,7 +140,7 @@ Database (NDB)
Používáte Nette Database Table (NDBT), tedy skvělou část NDB, ke které se přistupuje přes `$database->table(...)`?

- metoda `table()` byl přesunuta z `Connection` do nové třídy `Nette\Database\Context`. Ta "obsahuje":https://api.nette.org/2.1/Nette.Database.Context.html všechny důležité metody pro práci s databází, takže klidně změňte `Connection` za `Context` a máte hotovo.
- proměnné řádku `ActiveRow` jsou nyní read-only, pro změnu slouží metoda `$row->update(array('field' => 'value'))`. Věřte, že dřívější chování mělo tolik úskalí, že jiná cesta nebyla.
- proměnné řádku `ActiveRow` jsou nyní read-only, pro změnu slouží metoda `$row->update(['field' => 'value'])`. Věřte, že dřívější chování mělo tolik úskalí, že jiná cesta nebyla.
- změnila se tzv. backjoin syntaxe z `book_tag:tag.name` na `:book_tag.tag.name` (dvojtečka na začátku)
- místo druhého parametru `$having` v metodě `group()` použijte metodu `having()`
- Selection: removed support for INNER join in where statement ("commit":https://github.com/nette/nette/commit/68314840e2429351d1e37e00c6070a21bdc36744)
Oops, something went wrong.

0 comments on commit e6057d6

Please sign in to comment.