Laravel'de Custom Helper Fonksiyonları Yazmak
Her Laravel projesinde tekrar eden küçük işler vardır: fiyat formatlama, Türkçe tarih gösterme, slug oluşturma, telefon numarası temizleme... Bunları her controller'da, her view'da ayrı ayrı yazmak yerine helper fonksiyonları oluşturursunuz. Bir kez yazarsınız, her yerden çağırırsınız — format_price(1500) gibi.
Helper Dosyasını Oluşturmak
app/helpers.php dosyası oluşturun:
<?php
if (!function_exists('format_price')) {
function format_price(float $price, string $currency = '₺'): string
{
return number_format($price, 2, ',', '.') . ' ' . $currency;
}
}
if (!function_exists('turkish_date')) {
function turkish_date(?string $date, string $format = 'd F Y'): string
{
if (!$date) {
return '';
}
$months = [
'January' => 'Ocak', 'February' => 'Şubat', 'March' => 'Mart',
'April' => 'Nisan', 'May' => 'Mayıs', 'June' => 'Haziran',
'July' => 'Temmuz', 'August' => 'Ağustos', 'September' => 'Eylül',
'October' => 'Ekim', 'November' => 'Kasım', 'December' => 'Aralık',
];
$formatted = date($format, strtotime($date));
return str_replace(array_keys($months), array_values($months), $formatted);
}
}
if (!function_exists('clean_phone')) {
function clean_phone(string $phone): string
{
return preg_replace('/[^0-9]/', '', $phone);
}
}
function_exists() kontrolü önemli — aynı dosya birden fazla kez yüklenirse veya başka bir pakette aynı isimde fonksiyon varsa çakışmayı önler.
Composer ile Autoload
Helper dosyasını Laravel'e tanıtmanın yolu composer.json'daki autoload:
{
"autoload": {
"files": [
"app/helpers.php"
],
"psr-4": {
"App\\": "app/"
}
}
}
Sonra autoload'u yeniden oluşturun:
composer dump-autoload
Bu kadar. Artık format_price(), turkish_date(), clean_phone() fonksiyonları projenizin her yerinden erişilebilir — controller'dan, view'dan, model'den, artisan command'dan.
Kullanım Örnekleri
Blade'de
<span class="price">{{ format_price($product->price) }}</span>
{{-- Çıktı: 1.500,00 ₺ --}}
<time>{{ turkish_date($post->created_at, 'd F Y') }}</time>
{{-- Çıktı: 15 Ocak 2026 --}}
Controller'da
public function store(Request $request)
{
$user = User::create([
'phone' => clean_phone($request->phone), // 0532 123 45 67 → 05321234567
]);
}
Daha Fazla Gerçek Dünya Helper'ı
Projelerimde sıkça kullandığım helper fonksiyonları:
if (!function_exists('excerpt')) {
function excerpt(?string $text, int $length = 150): string
{
if (!$text) {
return '';
}
$clean = strip_tags($text);
if (mb_strlen($clean) <= $length) {
return $clean;
}
return mb_substr($clean, 0, $length) . '...';
}
}
if (!function_exists('file_size')) {
function file_size(int $bytes): string
{
$units = ['B', 'KB', 'MB', 'GB'];
$i = 0;
while ($bytes >= 1024 && $i < count($units) - 1) {
$bytes /= 1024;
$i++;
}
return round($bytes, 1) . ' ' . $units[$i];
}
}
if (!function_exists('active_class')) {
function active_class(string $routeName, string $class = 'active'): string
{
return request()->routeIs($routeName . '*') ? $class : '';
}
}
if (!function_exists('setting')) {
function setting(string $key, mixed $default = null): mixed
{
return cache()->rememberForever("setting.{$key}", function () use ($key, $default) {
return \App\Models\Setting::where('key', $key)->value('value') ?? $default;
});
}
}
active_class() özellikle sidebar menülerinde çok işe yarıyor — <li class="{{ active_class('admin.posts') }}"> tek satırla aktif menüyü işaretliyor.
setting() fonksiyonu da veritabanındaki ayarları cache'den okuyor. Her istek için database sorgusu atmak yerine bir kez okuyup cache'liyor.
Helper mı, Facade mı, Trait mi?
Ne zaman hangisini kullanmalı:
Helper fonksiyonu — Basit, stateless işlemler. format_price(), turkish_date(), excerpt(). Parametre alır, sonuç döner, yan etkisi yok.
Facade/Service — Daha karmaşık, state tutan veya dependency gerektiren işler. Ödeme işlemi, API çağrısı, dosya yönetimi.
Trait — Model veya controller'a davranış eklemek. HasSlug, HasSEO, Sortable.
Kural basit: eğer fonksiyon 10 satırı geçmiyorsa ve hiçbir dependency'si yoksa helper yapın. Daha karmaşıksa service class'a çıkarın.
Dikkat Edilecekler
- Helper dosyasını küçük tutun. 50+ fonksiyon biriken
helpers.phpbakım kabusuna döner. Çok fonksiyon varsa kategoriye göre ayırın:helpers/string.php,helpers/date.php,helpers/format.php function_exists()kontrolünü atlayın — framework veya paket çakışmalarında debug etmek zor olur- Helper'larda Eloquent sorgusu yapmaktan kaçının (setting helper'ı hariç — o da cache'li). Helper'lar basit dönüşüm işleri için
- Global namespace kirliliğine dikkat — çok generic isimler (
format,clean,parse) kullanmayın