viktor3177's avatar

Laravel 9 - How to make page url {slug}?

Can't make page url {slug}! When I type a page, all pages appear at once, and so on with any url.

It should be like this domain.com/page-title (url).

Here is the controller.

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Intervention\Image\Facades\Image;

class PostController extends Controller
{
	public function PostPage() {
		$postpage = Post::latest()->get();
		return view('admin.post.post_all', compact('postpage'));
	}

	public function AddPost() {
		return view('admin.post.post_add');
	}

	public function StorePost(Request $request) {
		$image_post = $request->file('image_post');
		$name_gen = hexdec(uniqid()).'.'.$image_post->getClientOriginalExtension();
		Image::make($image_post)->save('upload/image_post/'.$name_gen);
		$save_url = 'upload/image_post/'.$name_gen;


		Post::insert([
			'title_name_post' => $request->title_name_post,
			'slug' => $request->slug,
			//$post->slug = Str::slug($data['slug']);
			'description_post' => $request->description_post,
			'image_post' => $save_url,
			'meta_title_post' => $request->meta_title_post,
			'meta_description_post' => $request->meta_description_post,
			'meta_keyword_post' => $request->meta_keyword_post,
		]);
		$notification = array(
			'message' => 'Post Inserted Successfully',
			'alert-type' => 'success'
		);

		return redirect()->route('post.page')->with($notification);
	}

	public function EditPost($id) {
		$post = Post::findOrFail($id);
		return view('admin.post.post_edit', compact('post'));
	}

	public function UpdatePost(Request $request) {
		$post_id = $request->id;

		if ($request->file('image_post')) {
			$image_post = $request->file('image_post');
			$name_gen = hexdec(uniqid()).'.'.$image_post->getClientOriginalExtension();

			Image::make($image_post)->save('upload/image_post/'.$name_gen);
			$save_url = 'upload/image_post/'.$name_gen;

			Post::findOrFail($post_id)->update([
				'title_name_post' => $request->title_name_post,
				'description_post' => $request->description_post,
				'image_post' => $save_url,
				'meta_title_post' => $request->meta_title_post,
				'meta_description_post' => $request->meta_description_post,
				'meta_keyword_post' => $request->meta_keyword_post,
			]);
			$notification = array(
				'message' => 'Post Updated with Image Successfully',
				'alert-type' => 'success'
			);
			return redirect()->route('post.page')->with($notification);
		} else {
			Post::findOrFail($post_id)->update([
				'title_name_post' => $request->title_name_post,
				'slug' => $request->slug,
				'description_post' => $request->description_post,
				'meta_title_post' => $request->meta_title_post,
				'meta_description_post' => $request->meta_description_post,
				'meta_keyword_post' => $request->meta_keyword_post,
			]);
			$notification = array(
				'message' => 'Post Updated without Image Successfully',
				'alert-type' => 'success'
			);
			return redirect()->route('post.page')->with($notification);
		}
	}

	public function DeletePost($id) {
		$post = Post::findOrFail($id);
		$img = $post->image_post;
		unlink($img);

		Post::findOrFail($id)->delete();
		$notification = array(
			'message' => 'Post Deleted Successfully',
			'alert-type' => 'success'
		);

		return redirect()->route('post.page')->with($notification);
	}


	public function HomePost() {
		$postpage = Post::find(1);
		return view('frontend.view', compact('postpage'));
	}
}

Here is the route.

Route::controller(PostController::class)->group(function () {
	Route::get('/post/page', 'PostPage')->name('post.page');
	Route::get('/add/post', 'AddPost')->name('add.post');
	Route::post('/store/post', 'StorePost')->name('store.post');
	Route::get('/edit/post/{id}', 'EditPost')->name('edit.post');
	Route::post('/update/post/{id}', 'UpdatePost')->name('update.post');
	Route::get('/delete/post/{id}', 'DeletePost')->name('delete.post');
	Route::get('/{slug}', 'HomePost')->name('home.post');
});

Here is the page.

@php

    $post = App\Models\Post::latest()->get();

@endphp

<section class="white-bg hotel-feature-step service-view">
    <div class="container-fluid p-0">
        <div class="row no-gutters">
            <div class="row">
                @foreach($post as $post_item)
                    <div class="fleet-block-card">
                        <img src="{{ asset($post_item->image_post) }}" alt="">
                        <h3>{{ $post_item->description_post }}</h3>
                    </div>
                @endforeach
            </div>
        </div>
    </div>
</section>
0 likes
22 replies
Nihir's avatar

I personally use cviebrock sluggable for creating slug at easy way

You should try it

tykus's avatar

Given this Route:

Route::controller(PostController::class)->group(function () {
    // ...
	Route::get('/{slug}', 'HomePost')->name('home.post');
});

Your controller action should accept a parameter $slug which you use to locate the Post instance:

public function HomePost($slug)
{
    $post = Post::where('slug', $slug)->firstOrFail();
    return view('frontend.view', compact('post'));
}

Then only that Post instance in the correct view template; without querying for all of the Posts again! Assuming the view template you shared if frotend.view, then:

<!-- remove this -->
@php
    $post = App\Models\Post::latest()->get();
@endphp

<!-- and the foreach loop -->
@foreach($post as $post_item)
@endforeach
<!-- display only the Post -->
<div class="fleet-block-card">
    <img src="{{ asset($post->image_post) }}" alt="">
    <h3>{{ $post->description_post }}</h3>
</div>
3 likes
viktor3177's avatar

@tykus

Now here is the error.

Property [image_post] does not exist on this collection instance.

tykus's avatar

@viktor3177 How do you have a Collection still? Did you remove the Eloquent query from the view template?

viktor3177's avatar

@tykus

  @extends('frontend.main_master')
  @section('main')
    @php

    $post = App\Models\Post::latest()->get();

@endphp

<section class="white-bg hotel-feature-step service-view">
    <div class="container-fluid p-0">
        <div class="row no-gutters">
            <div class="row">
            @foreach($post as $post_item)

            @endforeach
            <!-- display only the Post -->
                <div class="fleet-block-card">
                    <img src="{{ asset($post->image_post) }}" alt="">
                    <h3>{{ $post->description_post }}</h3>
                </div>
            </div>
        </div>
    </div>
</section>

@endsection

tykus's avatar

Did you read my earlier reply at all?

@extends('frontend.main_master')
@section('main')
<section class="white-bg hotel-feature-step service-view">
    <div class="container-fluid p-0">
        <div class="row no-gutters">
            <div class="row">
                <div class="fleet-block-card">
                    <img src="{{ asset($post->image_post) }}" alt="">
                    <h3>{{ $post->description_post }}</h3>
                </div>
            </div>
        </div>
    </div>
</section>
@endsection
1 like
viktor3177's avatar

@tykus

I have another problem! I put this code in the route

 Route::get('/{slug}', 'HomePost')->name('home.post');

and I got a 404 error in the admin panel. And on static pages too. When I close this code everything works.

viktor3177's avatar

@tykus

It is when I write this code that it does not work, and if I comment it out, then everything works.

And before that everything worked.

tykus's avatar

@viktor3177 but this is a catch-all route, so it is catching some static routes and/or admin route unintentionally, right? Where are these other route defined?

viktor3177's avatar

@tykus

Here is my entire route.

Route::get('/', function () {
	return view('frontend.index');
});

Route::controller(DemoController::class)->group(function () {
	Route::get('/contact', 'ContactMethod')->name('contact.page');
});

//Admin All Route
Route::controller(AdminController::class)->group(function () {
	Route::get('/admin/logout', 'destroy')->name('admin.logout');
	Route::get('/admin/profile', 'Profile')->name('admin.profile');
	Route::get('/edit/profile', 'EditProfile')->name('edit.profile');
	Route::post('/store/profile', 'StoreProfile')->name('store.profile');
	Route::get('/change/password', 'ChangePassword')->name('change.password');
	Route::post('/update/password', 'UpdatePassword')->name('update.password');
});

//Home Slide All Route
Route::controller(HomeSlideController::class)->group(function () {
	Route::get('/home/slide', 'HomeSlider')->name('home.slide');
	Route::post('/update/slider', 'UpdateSlider')->name('update.slider');
});

//Post Controller
Route::controller(PostController::class)->group(function () {
	Route::get('/post/page', 'PostPage')->name('post.page');
	Route::get('/add/post', 'AddPost')->name('add.post');
	Route::post('/store/post', 'StorePost')->name('store.post');
	Route::get('/edit/post/{id}', 'EditPost')->name('edit.post');
	Route::post('/update/post/{id}', 'UpdatePost')->name('update.post');
	Route::get('/delete/post/{id}', 'DeletePost')->name('delete.post');
	Route::get('/{slug}', 'HomePost')->name('home.post');
});

//About Controller
Route::controller(AboutController::class)->group(function () {
	Route::get('/about/page', 'AboutPage')->name('about.page');
	Route::post('/update/about', 'UpdateAbout')->name('update.about');
	Route::get('/about', 'HomeAbout')->name('home.about');
});

//Contact us Controller
Route::controller(ContactController::class)->group(function () {
	Route::get('/contact/page', 'ContactPage')->name('contact.page');
	Route::post('/update/contact', 'UpdateContact')->name('update.contact');
	Route::get('/contact', 'HomeContact')->name('home.contact');
});

//Faq Controller
Route::controller(FaqController::class)->group(function () {
	Route::get('/faq/page', 'FaqPage')->name('faq.page');
	Route::get('/add/faq', 'AddFaq')->name('add.faq');
	Route::post('/store/faq', 'StoreFaq')->name('store.faq');
	Route::get('/edit/faq/{id}', 'EditFaq')->name('edit.faq');
	Route::post('/update/faq/{id}', 'UpdateFaq')->name('update.faq');
	Route::get('/delete/faq/{id}', 'DeleteFaq')->name('delete.faq');
	Route::get('/faq', 'HomeFaq')->name('home.faq');
});

//Rates Controller
Route::controller(RatesController::class)->group(function () {
	Route::get('/rates/page', 'RatesPage')->name('rates.page');
	Route::get('/add/rates', 'AddRates')->name('add.rates');
	Route::post('/store/rates', 'StoreRates')->name('store.rates');
	Route::get('/edit/rates/{id}', 'EditRates')->name('edit.rates');
	Route::post('/update/rates/{id}', 'UpdateRates')->name('update.rates');
	Route::get('/delete/rates/{id}', 'DeleteRates')->name('delete.rates');
	Route::get('/rates', 'HomeRates')->name('home.rates');
});

//Fleet Controller
Route::controller(FleetController::class)->group(function () {
	Route::get('/fleet/page', 'FleetPage')->name('fleet.page');
	Route::get('/add/fleet', 'AddFleet')->name('add.fleet');
	Route::post('/store/fleet', 'StoreFleet')->name('store.fleet');
	Route::get('/edit/fleet/{id}', 'EditFleet')->name('edit.fleet');
	Route::post('/update/fleet/{id}', 'UpdateFleet')->name('update.fleet');
	Route::get('/delete/fleet/{id}', 'DeleteFleet')->name('delete.fleet');
	Route::get('/fleet', 'HomeFleet')->name('home.fleet');
});

//Reservation
Route::controller(ReservationController::class)->group(function () {
	Route::get('/reservation', 'Reservation')->name('reservation');
	Route::post('/store/reservation', 'StoreReservation')->name('store.reservation');
	Route::get('/contact/reservation', 'ContactReservation')->name('contact.reservation');
	Route::get('/edit/reservation/{id}', 'EditReservation')->name('edit.reservation');
	//Route::post('/update/reservation/{id}', 'UpdateReservation')->name('update.reservation');
	Route::get('/delete/reservation/{id}', 'DeleteReservation')->name('delete.reservation');
});

//Request
	Route::controller(RequestrideController::class)->group(function () {
	Route::get('/request', 'Requestride')->name('request');
	Route::post('/store/request', 'StoreRequestride')->name('store.request');
	Route::get('/contact/request', 'ContactRequestride')->name('contact.request');
	Route::get('/edit/request/{id}', 'EditRequestride')->name('edit.request');
	Route::get('/delete/request/{id}', 'DeleteRequestride')->name('delete.request');
});

Route::get('/dashboard', function () {
	return view('admin.index');
})->middleware(['auth', 'verified'])->name('dashboard');

require __DIR__.'/auth.php';
tykus's avatar

@viktor3177 move the catch-all route to the very end of your routes file so that it is not incorrectly matched against your other defined URIs

1 like
Lumethys's avatar

@tykus dont use eloquent query in view, the whole point of a controller is to prevent you form doing that

viktor3177's avatar

So far everything seems to be working! Once again THANK YOU!

Please or to participate in this conversation.