.htaccess a Rewrite na gigaserveru („Cannot load presenter ‚Post‘“)
- EvaJ
- Člen | 6
Dobrý den,
možná kladu už omílaný dotaz, chtěla bych ale poprosit o polopatickou radu na míru…
Snažím se zprovoznit nette na svém hostingu na gigaserveru (kam mám
přístup pouze vzdáleně, nemám tam composer ani tracy). Postupuji podle
návodu v quickstartu, vše fungovalo až do kroku, kde se na zvláštní
stránce pomocí PostPresenteru zobrazuje jednotlivý příspěvek. Odkazy
z úvodní stránky se netvoří správně a v logu najdu:
PHP User Warning: Invalid link: Cannot load presenter ‚Post‘, class
‚App\Presenters\PostPresenter‘ was not found.
Vzhledem k tomu, že soubory mám přesně podle návodu, soudím, že problém bude s nastavením .htaccess. Momentálně je takovýto:
# Apache configuration file (see https://httpd.apache.org/docs/current/mod/quickreference.html)
Require all granted
# enable cool URL
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# use HTTPS
# RewriteCond %{HTTPS} !on
# RewriteRule .? https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# prevents files starting with dot to be viewed by browser
RewriteRule /\.|^\.(?!well-known/) - [F]
# front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|mjs|ico|gif|jpg|jpeg|png|webp|svg|css|rar|zip|7z|tar\.gz|map|eot|ttf|otf|woff|woff2)$ index.php [L]
</IfModule>
# enable gzip compression
<IfModule mod_deflate.c>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json application/xml image/svg+xml
</IfModule>
</IfModule>
Moje adresářová struktura, jak vidím přes FTP na hostingu:
mojedomena.cz/ - tam je momentálně funkční web, který s nette nesouvisí
test.mojedomena.cz/ - tam se snažím rozchodit nette
www/ - to je tedy ten veřejný adresář a tam je taky dotyčný .htaccess.
Nemám problém s tím, že se musí přípisovat do URL to „www“. Ale odkazy, které mají vést na jednotlivé příspěvky, vypadají takhle, což je jistě chyba:
http://test.mojedomena.cz/www/#
Děkuji, pěkný den,
Eva
Editoval EvaJ (12. 12. 2020 10:01)
- Ondřej Kubíček
- Člen | 494
to nemá s htaccessem nic společného, autoload ti nenaloadoval ten presenter, otázka je proč. U sebe na lokálu ti to všechno funguje, pak to celý nahraješ na server a nejde to?
- EvaJ
- Člen | 6
Ondřej Kubíček napsal(a):
to nemá s htaccessem nic společného, autoload ti nenaloadoval ten presenter, otázka je proč. U sebe na lokálu ti to všechno funguje, pak to celý nahraješ na server a nejde to?
U sebe lokálně jsem to nezkoušela, neběží mi tu PHP server atd. Doufala jsem, že to nebudu potřebovat, ale asi to jinak nepůjde :(
- EvaJ
- Člen | 6
Tak už mám lokálně Apache, PHP, MySQL, instalaci web-project pomocí
composeru, do které jsem dokopírovala soubory podle návodu.
A dopracovala jsem se ke stejné chybě „Invalid link: Cannot load presenter
‚Post‘, class ‚App\Presenters\PostPresenter‘ was not found.“ :(
Soubor app/Presenters/PostPresenter.php:
namespace App\Presenters;
use Nette;
use Nette\Application\UI\Form;
class PostPresenter extends Nette\Application\UI\Presenter
{
/** @var Nette\Database\Context */
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderShow(int $postId): void
{
$post = $this->database->table('posts')->get($postId);
if (!$post) {
$this->error('Stránka nebyla nalezena');
}
$this->template->post = $post;
}
protected function createComponentCommentForm(): Form
{
$form = new Form; // means Nette\Application\UI\Form
$form->addText('name', 'Jméno:')
->setRequired();
$form->addEmail('email', 'E-mail:');
$form->addTextArea('content', 'Komentář:')
->setRequired();
$form->addSubmit('send', 'Publikovat komentář');
return $form;
}
}
A soubor app/Presenters/Templates/Post/show.latte:
{block content}
<p><a n:href="Homepage:default">← zpět na výpis příspěvků</a></p>
<div class="date">{$post->date_internal|date:'F j, Y'}</div>
<h1 n:block="title">{$post->title}</h1>
<div class="post">{$post->content}</div>
- Šaman
- Člen | 2668
Můžeš celý projekt nahrát třeba na GitHub ? V tom co jsi poslala chybu nevidím.
(Hádám, že někde bude překlep, ale název třidy i namespace je dobře…
ještě mě napadá taková blbost, jestli ten soubor s presenterem má za
začátku značku <?php
. Používáš nějaký editor, který by
tě na takové základní syntaktické chyby upozornil? Prostě budeme v celém
projektu hledat kde je nějaká skrytá chyba. Věci, které posíláš jsou
řekl bych v pohodě a s htaccess to nejspíš souviset nebude.)
P.S. Jen podotýkám, že to nemůže najít třídu a že Nette má
v základním nastavení Robot Loader, který prochází všechny soubory ve
složce /app
a podsložkách. Takže ten soubor by mohl být
i jinde, nebo být špatně pojmenovaný, dokonce může být i více tříd
v jednom php souboru. Klíčové je jen to, aby existoval někde pod
/app
, měl příponu .php
a obsahoval validní třídu
ve správném namespace.
Pokud nasdílíš ten projekt, můžeme ti zkontrolovat i jestli máš dobře nastavený robot loader.
Editoval Šaman (14. 12. 2020 15:25)
- EvaJ
- Člen | 6
Šaman napsal(a):
ještě mě napadá taková blbost, jestli ten soubor s presenterem má za začátku značku
<?php
.
Jé, tak to je vtipné, problém vyřešen. Moc děkuju.
Samozřejmě to tam nebylo, zkopírovala jsem doslova to, co bylo na stránce https://doc.nette.org/…/single-post,
jak je tam psáno „PostPresenter by mohl tedy vypadat takto“ :-) Zdá se,
že návod není dost blbuvzdorný :-)
Děkuji ještě jednou, Eva
- Šaman
- Člen | 2668
No, jako… je to návod na framework, nikoliv na první krůčky v PHP :)
Ale obecně doporučuji nějaký editor, který umí alespoň obarvovat syntax, v lepším případě i nějakou základní analýzu kódu. Ten druhý by asi dal vědět, že tam chybí značka (tedy že se nejedná o PHP kód). Kromě toho i jednoduché editory umí obarvovat klíčová slova a párovat závorky, což se hodí proti překlepům.