2017-01-16 18 views
0

Я создаю URL-адрес в моем приложении, но он не работает, приложение дает мне некоторые проблемы, связанные с «-». Это дает мне ошибку:URL-адрес в маршрутах

ErrorException in PostController.php line 60: 
Trying to get property of non-object 

Мой идеальный URL является:

http://domain.com/CATEGORY-title-of-post-ID 

Мой маршрут:

Route::get('{category}-{title}-{id}', '[email protected]'); 

PostController шоу функция:

public function show($category,$title,$id) 
    { 
     $post = Post::find($id); 
     $user = Auth::user(); 

     $comments = Comment::where('post_id',$id) 
          ->where('approved',1) 
          ->get(); 




     return view('posts.show',compact('post','comments','user')); 
    } 

клинка Посмотреть:

<?php 
    $title_seo = str_slug($feature->title, '-'); 
?> 
<a href="{{url($feature->categories[0]->internal_name."-".$title_seo."-".$feature->id)}}" rel="bookmark"> 
...</a> 

ответ

2

Там есть библиотека называется Eloquent-Sluggable, что создаст уникальную слизняка для каждой должности и правильно URL закодировать его.

Для установки (взято из документации):

composer require cviebrock/eloquent-sluggable:^4.1 

Затем обновите config/app.php путем добавления записи для поставщика услуг.

'providers' => [ 
    // ... 
    Cviebrock\EloquentSluggable\ServiceProvider::class, 
]; 

Наконец, из командной строки снова опубликовать файл конфигурации по умолчанию:

php artisan vendor:publish --provider="Cviebrock\EloquentSluggable\ServiceProvider" 

Чтобы использовать, добавьте черту Sluggable к модели:

use Cviebrock\EloquentSluggable\Sluggable; 

class Post extends Model 
{ 
    use Sluggable; 

    /** 
* Return the sluggable configuration array for this model. 
* 
* @return array 
*/ 
public function sluggable() 
{ 
    return [ 
     'slug' => [ 
      'source' => 'title' 
      ] 
     ]; 
    } 

} 

При сохранении экземпляр вашей модели, библиотека автоматически создаст пул и сохранит его во вновь созданном столбце slug таблицы вашей модели. Таким образом, чтобы получить доступ к слизу, вы должны использовать $model->slug

Для достижения желаемого слизня, а не создания его с title по умолчанию. Вы можете передать атрибут sluggable метода массив имен полей source, используя точечную нотацию, чтобы получить доступ к атрибутам родственного модели, например, так:

public function sluggable() 
{ 
    return [ 
     'slug' => [ 
      'source' => ['category.name','title','id'] 
      ] 
     ]; 
    } 

} 
+0

Привет спасибо за ответ, я просто реализовать, и уже спасительный его в моей базе данных, но у меня есть один вопрос, как я бы структурировать ее в моем пути? Это все еще дает мне ошибку. – Pedro

+0

Есть ли причина, по которой вам нужно использовать '{category} - {title} - {id}'? Я думаю, что, потому что вы разделяете каждую черту, а sluggable использует тире тоже, она не уверена, когда ваша категория заканчивается и начинается название. Если вы используете 'title', как в примере по умолчанию, вы можете передать его вашему контроллеру и сделать' Posts :: where ('slug', $ slug) -> first(); '. Если вы все еще хотите использовать категорию, лучше всего разделить слэш ('/') и отразить это на вашем маршруте – TimothyBuktu

1

Почему вы genering ваш «дружественный URL» вручную?

У вас есть вспомогательная функция route, которая создает для вас URL-адрес, основанный на данных параметрах.

Route::get('{category}-{title}-{id}', [ 
    'as => 'post.show', 
    'uses' => '[email protected]' 
]); 

echo route('post.show', ['testing', 'title', 'id']); // http://domain.dev/testing-title-id 

Это не самый лучший подход к реализации SEO дружественных URL-адресов, в любом случае.


В контроллере вы всегда использовать идентификатор, чтобы найти запись, что означает, что категория и название совершенно бесполезны для определения, какой ресурс должен быть подан к пользователю.

Вы можете сделать вашу жизнь проще, делая что-то вроде:

Route::get('{id}-{slug}', [ 
    'as => 'post.show', 
    'uses' => '[email protected]' 
]); 

echo route('post.show', ['id', 'slug']); // http://domain.dev/id-slug 

В вашей модели вы создаете вспомогательную функцию, которая генерирует слизняк для вашего поста:

class Post 
{ 
    [...] 

    public function slug() 
    { 
     return str_slug("{$this->category}-{$this->title}"); 
    } 
} 

Затем в вашем контроллере вам нужно проверить, что слизень, используемый для доступа к статье, является правильным или нет, поскольку вы не хотите, чтобы Google индексировал сообщение с неправильными слизнями. Вы по существу вынуждаете URL-адрес определенным образом, и вы не теряете индексные точки.

class PostController 
{ 
    [...] 

    public function show($id, $slug) 
    { 
     $post = Post::findOrFail($id); 
     $user = Auth::user(); 

     if ($post->slug() !== $slug) { 
      return redirect()->route('posts.show', ['id' => 1, 'slug' => $post->slug()]); 
     } 

     $comments = Comment::where('post_id', $id)->where('approved', 1)->get(); 
     return view('posts.show', compact('post', 'comments', 'user')); 
    } 
}