Не передает url в laravel

Подскажите пожалуйста, в базе есть таблица pages, есть модель Page. В этой таблице есть поле url, этот url я передаю из роута в контроллер, с контроллера во view. Но почему то ошибка 404, если передавать id то все ок. Вот роут:

 Route::get('/page/{url}', 'PageController@page')->where('url', '[a-z]');

Контроллер:

<?php

namespace App\Http\Controllers;

use App\Category;
use App\Page;
use Illuminate\Http\Request;

class PageController extends Controller
{

    protected $catalog;
    protected $page;


    public function __construct()
    {
       // Коллекция всех категорий
      $this->category = Category::all();
      // Коллекция всех страниц
      $this->page = Page::all();
    }

    public function page($url) {
        $page_show = $this->page->find($url);
        $catalog = $this->category;
        $page = $this->page;
        $title = $page_show->title;
        echo $title;

        return view('page', ['catalog' => $catalog, 'page_show' => $page_show, 'page' => $page, 'title' => $title]);
    }
}

Укажите на ошибку, заранее спасибо!


Ответы (1 шт):

Автор решения: Alexandr Revnuk

Чтобы получать модель по url - нужно сначала в ней прописать метод:

public function getRouteKeyName()
{
    return 'url';
}

Теперь везде можно будет только достать по url. По id - не сработает. Тут осторожно!

Дальше в роуте - [a-z]+ - таким образом url будет только буквенной.

 Route::get('/page/{url}', 'PageController@page')->where('url', '[a-z]+');

А теперь контроллер:

<?php

namespace App\Http\Controllers;

use App\Category;
use App\Page;
use Illuminate\Http\Request;

class PageController extends Controller
{

    protected $catalog;
    protected $page;

    public function __construct()
    {
       // Коллекция всех категорий
      $this->category = Category::all();
      // Коллекция всех страниц
      $this->page = Page::all();
    }

    public function page(Page $singlePage) {
        $page_show = $singlePage;
        $catalog = $this->category;
        $page = $this->page;
        $title = $page_show->title;
        echo $title;

        return view('page', ['catalog' => $catalog, 'page_show' => $page_show, 'page' => $page, 'title' => $title]);
    }
}
→ Ссылка