2015-05-17 5 views
1

Я следующие настройки:Laravel Пользовательские маршрут модели Binding

routes.php

Route::get('{page?}', [ 
    'uses'=>'[email protected]', 
    'as'=>'page' 
])->where('page', '(.*)?'); 

RouteServiceProvider.php

$router->bind('page', function($value, $route) 
{ 
    if($value == "/"){ $value = "home"; }; 
    $explodedPage = explode("/",$value); 
    $page = Page::findBySlug(last($explodedPage)); 
    if(!isset($page)){ 
     \App::abort(404); 
    } 
    $ancestors = $page->ancestorsAndSelf()->get(); 
    $sections=array(); 
    foreach($ancestors as $ancestor) 
    { 
     $sections[]=$ancestor->slug; 
    } 
    if(implode("/",$sections)==$value){ 
     return $page; 
    }else{ 
     return $page; 
     //Else Redirect 
    } 
}); 

page.php

use Baum\Node; 
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 
use URL; 
use Venturecraft\Revisionable\RevisionableTrait; 
use Illuminate\Database\Eloquent\SoftDeletes; 
use Cviebrock\EloquentSluggable\SluggableInterface; 
use Cviebrock\EloquentSluggable\SluggableTrait; 

class Page extends Node implements SluggableInterface 
{ 

    use RevisionableTrait, SoftDeletes, SluggableTrait; 

    protected $sluggable = array(
     'build_from' => 'title', 
     'save_to' => 'slug', 
    ); 

    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = ['title', 'description', 'content', 'owner_id', 'system', 'status']; 

    /** 
    * The attributes excluded from the model's JSON form. 
    * 
    * @var array 
    */ 
    protected $hidden = ['parent_id','lft','rgt','depth']; 

    /** 
    * The attributes excluded from revision 
    * 
    * @var array 
    */ 
    protected $dontKeepRevisionOf = ['updater_id','parent_id','lft','rgt','depth']; 

} 

URLS выглядеть таких как:

localhost/ (uses pre-defined slug) 
localhost/page-slug 
localhost/parent-slug/page-slug 
localhost/parent-parent-slug/parent-slug/page-slug 
Etc... 

Извлечение страниц прекрасно работает; но мой вопрос относительно генерации URL

{{URL::route('page',$page)}} 

Просто Генерирует, локальный/страница Идентификатор

Я знаю, что я могу сделать:

{{URL::route('page',['page'=>$page->generateURLString()])}} 

Но я предпочел бы сделать это очиститель если возможно. Есть ли у кого-нибудь рекомендации?

ответ

1

Как вы говорите, вы можете сделать {{URL::route('page',['page'=>$page->generateURLString()])}}, потому что route('page',$page) вернет имя участника.

Тогда, мой совет, как вам нужно немного чище, чтобы создать пользовательскую функцию расширения класса маршрута или просто объявить его как обычная функция:

public function page($bind){ 
    return route('page', ['page' => $bind]); 
} 

Тогда просто сделать:

{{ page($page->generateURLString()) }} 
-1

Начиная с версии 5 теперь вы можете получить getRouteKey() на своем Model (до UrlRoutable), который вы можете использовать, чтобы вернуть свой собственный ключ маршрута. Что-то вроде:

class Page extends Node implements SluggableInterface 
{ 
    //...... 

    public function getRouteKey() { 
     return $this->generateURLString(); 
    } 
} 

Чтобы {{ route('page', $page) }} вести себя, как вы хотите.

Docs

+0

, пожалуйста, оберните биты кода обратными окнами. Благодаря! – YakovL

+0

Хорошо, спасибо за советы, я немного отредактировал свой ответ. – Ron

Смежные вопросы