Zbavení prefixu presenteru
- vanaveno
- Člen | 144
Ahojte, tak už jsem se díky Nette dopracoval ke své první webovce v tomto frameworku. Musím, říct, že to byla ze začátku trošku fuška, než jsem pochopil, co a jak funguje( mé předchozí php a zanlosti OOP byly minimální), ale potom, že to šlo docela rychle a strašně mě to začalo bavit. Mám však k vám jednu prosbu. Routování stránek(seo friendly), mám zatím vyřešené s prefixem presenteru, ale toho bych se chtěl zbavit.
V modelu mám tohle:
namespace App\Model;
use Nette\Utils\Image;
use Nette;
class PostsManager
{
use Nette\SmartObject;
/** @var Nette\Database\Context */
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function getPosts()
{
return $this->database->table('posts');
}
.......
Část RouteFactory.php
namespace App;
use Nette;
use Nette\Application\Routers\Route;
use Nette\Application\Routers\RouteList;
use App\Model\PostsManager;
use App\Model\TagsManager;
use App\Model\CategoryManager;
final class RouterFactory
{
/**
@var PostsManager
@inject
*/
public $postsManager;
/**
* @var CategoryManager
* @inject
*/
public $categoryManager;
/**
* @var TagsManager
* @inject
*/
public $tagsManager;
public function __construct(PostsManager $postsManager, CategoryManager $categoryManager, TagsManager $tagsManager)
{
$this->postsManager = $postsManager;
$this->categoryManager = $categoryManager;
$this->tagsManager = $tagsManager;
}
/**
* @return Nette\Application\IRouter
*/
public function createRouter()
{
$router = new RouteList;
$router[] = new Route('detail/[<lang_id=en>/]<cat_id>/<id>', array(
'presenter' => 'Post',
'action' => 'show',
'id' => array(
Route::FILTER_IN => function ($id) {
if(is_numeric($id)) {
return $id;}
else { return $this->postsManager->getPosts()->where('slug = ?', $id)->fetch()->id;}
},
Route::FILTER_OUT => function ($id) {
if(!is_numeric($id)) {
return $id;}
else { return $this->postsManager->getPosts()->get($id)->slug;}
}), ));
..................
V adresáře s routerfactory.php jsem vytvořil podle návodu, který jsem našel na youtubu od Jana Smitka tohle:
namespace App;
use App\Model\PostsManager;
use Nette;
class PostRoute extends \Nette\Application\Routers\Route {
/**
@var PostsManager
@inject
*/
public $postsManager;
public function match(\Nette\Http\IRequest $request) {
/** @var $appRequest \Nette\Application\Request */
$appRequest = parent::match($request);
$post = $this->postsManager->getPosts()->where('slug = ?', $id)->fetch()->id;
if(!is_numeric($appRequest->parameters['id'])) {
$post = $this->postsManager->getPosts()->where('slug', $appRequest['id'])->fetch();
if($post == NULL) {
return NULL;
}
$appRequest->parameters['id'] = $post->id;
}
return $appRequest;
}
Zkoušel jsem to různě napojit na routerfactory,ale nepodařilo se mi to
rozchodit. Mohl by mi někdo prosím pomoci? Jde mi o to bych se zbavil toho
prefixu detail/.
Díky
Editoval vanaveno (23. 4. 2019 11:26)
- vanaveno
- Člen | 144
PostRouter.php jsem vytvořil nakokenc takhle
namespace App;
use App\Model\PostsManager;
use Nette;
class PostRoute extends \Nette\Application\Routers\Route {
/**
@var PostsManager
@inject
*/
public $postsManager;
public function match(\Nette\Http\IRequest $request) {
/** @var $appRequest \Nette\Application\Request */
$appRequest = parent::match($request);
if(!is_numeric($appRequest->parameters['id'])) {
$post = $this->postsManager->getPosts()->where('slug', $appRequest['id'])->fetch();
if($post == NULL) {
return NULL;
}
$appRequest->parameters['id'] = $post->id;
}
return $appRequest;
}
A v RouterFacory.php jsem to napojil takto
$router[] = new PostRoute('[<lang_id=en>/]<cat_id>/<id>', array(
'presenter' => 'Post',
'action' => 'show',
'id' => array(
Route::FILTER_IN => function ($id) {
if(is_numeric($id)) {
return $id;}
else { return $this->postsManager->getPosts()->where('slug = ?', $id)->fetch()->id;}
},
Route::FILTER_OUT => function ($id) {
if(!is_numeric($id)) {
return $id;}
else { return $this->postsManager->getPosts()->get($id)->slug;}
}), ));
..................
Hází mi to chybu Trying to get property of non-object na řádku if(!is_numeric($appRequest->parameters[‚id‘])) { v PostRouter.php. Díky za radu jak to rozchodit bez toho detail/
Editoval vanaveno (25. 4. 2019 10:46)