За последние 24 часа нас посетили 22370 программистов и 1141 робот. Сейчас ищут 650 программистов ...

Не могу получить информацию о сервисе по slug

Тема в разделе "Laravel", создана пользователем yanuzay, 30 мар 2019.

  1. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    На данный момент получается вывести запись по id, по ссылке /cabinet/service/2

    Роуты:
    PHP:
    1. Route::get('/', function () {
    2.     return view('welcome');
    3. });
    4.  
    5. Route::group(['prefix'=>'cabinet', 'as' => 'cabinet.', 'namespace'=>'Cabinet', 'middleware'=>['auth']], function(){
    6.     Route::get('/', 'CabinetController@index')->name('index');
    7.     Route::group(['prefix'=>'service', 'as'=>'service.'], function () {
    8.         Route::get('/', 'ServiceController@index')->name('list');
    9.         Route::get('/{slug}', 'ServiceController@show')->name('item');
    10.     });
    11. });
    12.  
    13. Auth::routes();
    14.  
    15. Route::get('/home', 'HomeController@index')->name('home');
    Контроллер ServiceController.php:

    PHP:
    1. <?php
    2.  
    3. namespace App\Http\Controllers\Cabinet;
    4.  
    5. use App\Service;
    6. use Illuminate\Http\Request;
    7. use App\Http\Controllers\Controller;
    8.  
    9. class ServiceController extends Controller
    10. {
    11.     public function index()
    12.     {
    13.         return view('cabinet.index', [
    14.             'services' => Service::paginate(10)
    15.         ]);
    16.     }
    17.     public function show(Service $slug)
    18.     {
    19.         return view('cabinet.service.item', [
    20.               'service' => Service::where('slug', '=', $slug)->first()
    21.             ]
    22.         );
    23.     }
    Модель Service.php :
    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5. use Illuminate\Database\Eloquent\Model;
    6.  
    7. class Service extends Model
    8. {
    9.     protected $fillable = ['title', 'slug', 'published', 'description_short', 'description'];
    10.  
    11.     public function setSlugAttribute($value) {
    12.       $this->attributes['slug'] = Str::slug( mb_substr($this->title, 0, 40), '-');
    13.     }
    14.    
    15.     public function scopeLastServices($query, $count)
    16.     {
    17.       return $query->where('published', 1)->orderBy('created_at', 'desc')->take($count)->get();
    18.     }
    19. }
    При такой реализации метода show() выходит ошибка:
    Trying to get property 'title' of non-object (View: \resources\views\cabinet\service\item.blade.php)

    Т.е. Service::where('slug', '=', $slug)->first() и Service::where('slug', '=', $slug)->get() и Service::where('slug', $slug)->first() ничего не получают из базы.

    А вот если
    Route::get('/{slug}', 'ServiceController@show')->name('item');
    заменить на
    Route::get('/{id}', 'ServiceController@show')->name('item');

    И метод show переписать на:

    PHP:
    1. <?php
    2.  
    3. namespace App\Http\Controllers\Cabinet;
    4.  
    5. use App\Service;
    6. use Illuminate\Http\Request;
    7. use App\Http\Controllers\Controller;
    8.  
    9. class ServiceController extends Controller
    10. {
    11.     public function show(Service $id)
    12.     {
    13.         return view('cabinet.service.item', [
    14.               'service' => $id
    15.             ]
    16.         );
    17.     }
    То по ссылкам вида /cabinet/service/2 , выводится нужный сервис.
    Laravel 5.8
    Как исправить на вывод по slug?
     
  2. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    запутался в элементарных вещах))
    Изменил show(Service $slug) на show($slug) и все заработало
     
  3. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    В общем снова проблема с id и slug, но немного другая.

    Роуты такие:

    PHP:
    1. Route::group(['prefix'=>'cabinet', 'as' => 'cabinet.', 'namespace'=>'Cabinet', 'middleware'=>['auth']], function(){
    2.     Route::get('/', 'CabinetController@index')->name('index');
    3.     Route::group(['prefix'=>'service', 'as'=>'service.'], function () {
    4.         Route::get('/', 'ServiceController@index')->name('list');
    5.         Route::get('/{slug}', 'ServiceController@show')->name('item');
    6.         //Route::resource('/{slug}/inwork', 'InWorkController', ['as'=>'inwork']);
    7.         Route::group(['prefix'=>'/{slug}/inwork', 'as'=>'inwork.'], function () {
    8.             Route::get('/', 'InWorkController@show')->name('show');
    9.             Route::get('/edit', 'InWorkController@edit')->name('edit');
    10.             Route::post('/edit', 'InWorkController@edit')->name('edit');
    11.         });
    12.     });
    13. });
    В шаблоне на blade шаблонизаторе, написано:
    HTML:
    1. <a href="{{route('cabinet.service.inwork.show', $service)}}">Начать работу</a>
    Но ссылка формируется не со слагом, а с id , т.е. такая /cabinet/service/3/inwork.
    При переходе по ней 404 ошибка, а если в адресной строке заменить цифру 3 на соотвествующий слаг, но отображается нужна страница.

    Как сделать чтобы создавались ссылки как надо.
    Делал
    php artisan route:clear
    Но не помогло
     
  4. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    Помогли, нужно было написать так:
    Код (Text):
    1. <a href="{{route('cabinet.service.inwork.show', ['slug' => $service->slug])}}">Начать работу</a>