Zbavení prefixu presenteru

vanaveno
Člen | 144
+
0
-

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
+
0
-

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)