Routování dotazy do databáze se provádí i tehdy kdy nemají
- rosakovnik
- Člen | 13
Zdravím,
obracím se na Vás s jedním problémem. Mám blog, kde v route factory zadávám tuto masku, která id článku mění na jeho název v URL:
$router[] = new Route('<presenter>/<cathegoryId>[/<articleId>]', array(
'cathegoryId' => array(
Route::FILTER_IN => function($cathegoryId)
{
if (is_numeric($cathegoryId)){
return $cathegoryId;
} else {
return $this->connection->table('cathegory')->where('url', $cathegoryId)->fetch()->id;
}
},
Route::FILTER_OUT => function($cathegoryId)
{
if (!is_numeric($cathegoryId)){
return $cathegoryId;
} else {
return $this->connection->table('cathegory')->get($cathegoryId)->url;
}
}
),
'articleId' => array(
Route::FILTER_IN => function($articleId) {
if (is_numeric($articleId)){
return $articleId;
} else {
return $this->connection->table('articles')->where('url', $articleId)->fetch()->id;
}
},
Route::FILTER_OUT => function ($articleId) {
if (!is_numeric($articleId)){
return $articleId;
} else {
return $this->connection->table('articles')->get($articleId)->url;
}
}
),
'presenter' => 'Basic',
'action' => 'Uvod'
));
V případě presenteru Basic se to provede v podstatě správně a vše funguje více méně jak má. Problém nastane tehdy, když se přesměruji na jiný libovolný presenter. Tehdy mi to nahlásí chybu:
Trying to get property of non-object :
return $this->connection->table('cathegory')->where('url', $cathegoryId)->fetch()->id;
Zkrátka se z nějakého důvodu dotazy /--php
$this->connection->table(‚articles‘)->get($articleId)->url;
\--
provádí i u jiných presenterů ale z mého pohledu by se to mělo provést
pouze v případě presenteru Basic.
Děkuji za jakoukoli radu proč se to děje a jak bych to měl opravit
- rosakovnik
- Člen | 13
Já vím, je tam určitě spousta sémantických chyb…
connection předávám konstruktorem:
/** @var Connection */
protected $connection;
function __construct(\Nette\Database\Context $connection)
{
$this->connection= $connection;
}
- David Matějka
- Moderator | 6445
nemas nahodou php 5.3? tam neni mozne pouzivat $this
v anonymnich fcich, musis si tam zavislosti predat pomoci use
(bud
aliasujes $this
na $that
, ale pozor – pak musi byt
connection public; nebo tam pomoci use predas primo
$connection
)
- rosakovnik
- Člen | 13
matej21 napsal(a):
nemas nahodou php 5.3? tam neni mozne pouzivat
$this
v anonymnich fcich, musis si tam zavislosti predat pomociuse
(bud aliasujes$this
na$that
, ale pozor – pak musi byt connection public; nebo tam pomoci use predas primo$connection
)
Mám verzi 5.5.15, takže by to v tom asi být nemělo…
- Ot@s
- Backer | 476
$this->connection->table('cathegory')->where('url', $cathegoryId)->fetch()
Ti vrací false, proto to ...->id
logicky vyhazuje Trying to
get property of non-object (schválně si vydumpuj obsah $cathegoryId).
Problém je v tom, že pravidlo routy je univerzální a zápis
'presenter' => 'Basic',
znamená, že definuješ výchozí
presenter (a akci). Pokud routu chceš opravdu jen pro BasePresenter, tak
definici routy přepiš na:
$router[] = new Route('Basic/<cathegoryId>[/<articleId>]', array(....
a následně si vytvoř druhou pro všechny ostatní stránky. Na nějaké větší rady to není, protože nemáme více informací.
- rosakovnik
- Člen | 13
No, takto to v podstatě funguje, ovšem jednu věc nedokážu pochopit nebo to mám asi špatně. Když najedu na homepagePresenter, tak se mi udělá dotaz do databáze
„select * from cathegory“
a přitom by se tento dotaz přeci provést neměl nebo se mýlím? A nebo, když najedu na BasicPresenter, kde se mi vypisují články, tak se mi udělá cca 15 dotazů do databáze (když je tato routa vypnutá, tak pouze 2 dotazy, které mám v modelu nastavené):
SELECT *
FROM `cathegory`
...\temp\cache\_Nette.FileTemplate\_templates._layout.latte-7f7bc36d3f6cccdcbb7844d99b671a43.php:103 2
0.281
explain
SELECT `id`, `url`
FROM `cathegory`
WHERE (`cathegory`.`id` = 1)
...\app\router\RouterFactory.php:79 1
0.307
explain
SELECT `id`, `url`
FROM `cathegory`
WHERE (`cathegory`.`id` = 2)
...\app\router\RouterFactory.php:79 1
0.472
explain
SELECT `id`, `title`, `created_at`, `cat_id`
FROM `articles`
WHERE (`cat_id` = 1)
ORDER BY `created_at`
...\temp\cache\_Nette.FileTemplate\_Basic.uvod.latte-06e05e8c7cd2a6192919499f8bdaac7c.php:27 5
0.385
explain
SELECT `id`, `url`
FROM `cathegory`
WHERE (`cathegory`.`id` = 1)
...\app\router\RouterFactory.php:79 1
0.290
explain
SELECT *
FROM `articles`
WHERE (`articles`.`id` = 1)
...\app\router\RouterFactory.php:99 1
0.245
explain
SELECT `id`, `url`
FROM `cathegory`
WHERE (`cathegory`.`id` = 1)
...\app\router\RouterFactory.php:79 1
0.261
explain
SELECT *
FROM `articles`
WHERE (`articles`.`id` = 2)
...\app\router\RouterFactory.php:99 1
0.323
explain
SELECT `id`, `url`
FROM `cathegory`
WHERE (`cathegory`.`id` = 1)
...\app\router\RouterFactory.php:79 1
0.284
explain
SELECT *
FROM `articles`
WHERE (`articles`.`id` = 3)
...\app\router\RouterFactory.php:99 1
0.256
explain
SELECT `id`, `url`
FROM `cathegory`
WHERE (`cathegory`.`id` = 1)
...\app\router\RouterFactory.php:79 1
0.320
explain
SELECT *
FROM `articles`
WHERE (`articles`.`id` = 4)
...\app\router\RouterFactory.php:99 1
0.241
explain
SELECT `id`, `url`
FROM `cathegory`
WHERE (`cathegory`.`id` = 1)
...\app\router\RouterFactory.php:79 1
0.321
explain
SELECT *
FROM `articles`
WHERE (`articles`.`id` = 5)
...\app\router\RouterFactory.php:99
- Jan Suchánek
- Člen | 404
@Jan Tvrdík Super, že to někdo konečně vyvrátil, já si taky myslel že je to best practice, když se používá cache.
Editoval jenicek (11. 11. 2014 12:23)