DEV Community

Morcos Gad
Morcos Gad

Posted on

More Useful Laravel Tips

It would be great if you found this article containing 20 very useful and advanced Useful Laravel Tips that will help you in your future projects and I will only talk about some tips that caught my interest and find that I will use them a lot but visit the source for more depth https://ashallendesign.co.uk/blog/20-useful-laravel-tips

  • Using DATETIME Fields Instead of Booleans
class Post extends Model
{
    public function isPublished(): bool
    {
        return $this->published_at !== null; // is_published
    }
}
Enter fullscreen mode Exit fullscreen mode
  • Using 'when' in PendingRequest
$http = Http::withBasicAuth($username, $password);
if (app()->environment('local')) {
    $http->withoutVerifying();
}

// with when
$http = Http::withBasicAuth($username, $password)
    ->when(app()->environment('local'), function (PendingRequest $request) {
        $request->withoutVerifying();
    });
Enter fullscreen mode Exit fullscreen mode
  • Using getOrPut() in Collections
if (! $collection->has($key)) {
    $collection->put($key, $this->builtItem($data));
}
return $collection->get($key);

// getOrPut()
return $collection->getOrPut($key, fn () => $this->buildItem($data));
Enter fullscreen mode Exit fullscreen mode
  • Debugging HTTP Requests
Http::dump()->get($url);
Http::dd()->get($url);
Enter fullscreen mode Exit fullscreen mode
  • Replicating Models

you can duplicate a model like so

$post = Post::find(123);
$copiedPost = $post->replicate();
$copiedPost->save();
Enter fullscreen mode Exit fullscreen mode

If you want to exclude properties from being copied, you can pass the field names as an array into the method

$post = Post::find(123);
$copiedPost = $post->replicate([
    'author_id',
]);
$copiedPost->save();
Enter fullscreen mode Exit fullscreen mode

Additionally, the replicate method creates an unsaved model, so you can chain your usual model methods together. For example, we can copy the model and add " (copy)" on to the end of the title so that we can see that its been replicated

$post = Post::find(123);
$copiedPost = $post->replicate([
    'author_id',
])->fill([
    'title' => $post->title.' (copy)',
]);
$copiedPost->save();
Enter fullscreen mode Exit fullscreen mode
  • Using 'wasRecentlyCreated' on Models
$user = User::firstOrCreate(
    ['email' => request('email')],
    ['name' => request('name')],
);

if ($user->wasRecentlyCreated) {
    // Your user was just created...
} else {
    // Your user already exited and was fetched from the database...
}
Enter fullscreen mode Exit fullscreen mode
  • Moving Logic into Methods

let's say that we want to check if a user is approved. Our code might look like so

if ($user->approved === Approval::APPROVED) {
  // Do something...
}
Enter fullscreen mode Exit fullscreen mode

our model might now look like this

class User extends Model
{
    public function isApproved(): bool
    {
        return $this->approved === Approval::APPROVED;
    }
}

// now
if ($user->isApproved()) {
    // Do something...
}
Enter fullscreen mode Exit fullscreen mode
  • Changing the Key for Route Model Binding

let's say that you have a route that accepts a blog post's slug

Route::get('blog/{slug}', [BlogController::class, 'show']);

// Model
use App\Actions\PublishPost;
use App\Models\Post;

class BlogController extends Controller
{
    public function show($slug)
    {
        $post = Post::where('slug', $slug)->firstOrFail();

        return view('blog.show', [
            'post' => $post,
        ]);
    }
}

Enter fullscreen mode Exit fullscreen mode

to simplify this code and clean it up, we could update the slug parameter to be post:slug instead

Route::get('blog/{post:slug}', [BlogController::class, 'show']);

// Model
use App\Actions\PublishPost;
use App\Models\Post;

class BlogController extends Controller
{
    public function show(Post $post)
    {
        return view('blog.show', [
            'post' => $post,
        ]);
    }
}
Enter fullscreen mode Exit fullscreen mode

I hope you enjoyed these tips .

Top comments (1)

Collapse
 
logicsatinn profile image
Calvin Jackson • Edited

Beautiful. Thank you.

Route::get('blog/{slug}', [BlogController::class, 'show']); // but i'd advise committing to this if what you really want, to avoid any hiccups, by adding

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

to the model class. Just my piece of thought on this though.