Traitler basitçe kalıtsal özelliklerdir. Programlamada traitler, PHP gibi tek kalıtımlı dillerde kodun yeniden kullanımına yönelik bir mekanizma sunar.
Bir trait, bir geliştiricinin, farklı sınıf hiyerarşilerinde yaşayan birkaç bağımsız sınıfta yöntem kümelerini serbestçe yeniden kullanmasına olanak tanır ve böylece tek kalıtımlı dillerin bazı sınırlamalarını azaltır.
Traitler, farklı metotlar arasında paylaşılacak fonksiyonlarımız, kodun farklı yollarında yeniden kullanılacak metotlarımız olduğunda oluşturulur.
Bir özellik nasıl oluşturulur?
Laravel’de trait anahtar sözcüğünü kullanarak bir trait oluşturabiliriz ve ona use anahtar sözcüğünü kullanarak erişebiliriz, daha sonra bunu statik bir yöntem değilse $this aracılığıyla çağırırız, aksi halde self:: kullanırız.
Not: Traitler Laravel’e veya herhangi bir çerçeveye özgü değildir, PHP’de her şekilde ve her yerde kullanılabilir.
Peki hangi trait’i oluşturucağız?
Bir Resim Yükleme özelliği oluşturalım. Çoğu uygulama, kullanıcıların farklı zamanlarda fotoğraf yüklemesini gerektirir; bu, Profil Oluşturma, gönderi oluşturma, hikaye oluşturma, profil güncelleme, ödeme Kanıtı yükleme vb. aşamaları içerebilir. Dolayısıyla her durumda şunları yapmamız gerektiğini görüyoruz: Fotoğrafı yükleme mantığını ve kodunu tekrarlamamak için, bunu halledecek bir ImageUpload özelliğine sahip olmamız gerekir.
Adım 1: Trait klasörü ve dosyası oluşturun
App dizini içinde Traits adında bir klasör oluşturun ve bunun içinde ImageUpload.php dosyasını oluşturun, bunun içinde tek bir yöntemle upload() işlevi oluşturun ve aşağıdaki kodu yapıştırın:
app/Traits/ImageUpload.php
<?php
namespace App\Traits;
use Illuminate\Http\Request;
trait ImageUpload {
/**
* @param Request $request
* @return $this|false|string
*/
public function upload(Request $request, $fieldname = 'image', $directory = 'images' ) {
if( $request->hasFile( $fieldname ) ) {
if (!$request->file($fieldname)->isValid()) {
flash('Invalid Image!')->error()->important();
return redirect()->back()->withInput();
}
return $request->file($fieldname)->store($directory, 'public');
}
return null;
}
}
Adım 2: Bir controller içinde traiti kullanın
Diyelim ki bir PostController’ımız var.
app/Http/Controllers/PostController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Post;
use App\Traits\ImageUpload;
class PostController extends Controller
{
use ImageUpload;
/**
* Persist a resource in database.
*
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$image = $this->upload($request, 'image', 'posts');
Post::create([
'title' => $request->title,
'body' => $request->body,
'author_id' => $request->author,
'image' => $image
]);
return back()
->with('success','Post created successfully.');
}
}
Kolay, değil mi?
Controller sınıfının içine use ImageUpload
‘u ekleyerek özelliği denetleyiciye ekledik. ve bunu $this->functionName
ile çağırdık.
Kodları yeniden kullanılabilir hale getirmek için traitlerin nasıl kullanılacağını gördünüz ve bu, controller sınıfının da okunabilir olmasını sağlıyor. Kullanıcıları kaydetmek veya uygulamanın farklı bölümlerinde yeniden kullanılabilecek birçok başka şey yapmak için traitleri kullanabiliriz.