Merhaba,
Normalde Controller sınıfında tanımlanmış bir değişkeni blade dosyasında en basit haliyle şu şekilde gönderebiliyoruz (verdiğim örnek üzerine çalıştığım projeden bağımsızdır):
class AlbumController
{
public function index(): View
{
$album = "Beauty Behind The Madness";
$artist = "The Weeknd";
return view('info', compact('album', 'artist'));
}
}
Controller sınıfını basit tutmak adına (değişkenleri tanımlamak çoğu zaman yukarıdaki kadar kolay olmuyor 😃) mantıksal işlemleri yapmak için bir Service sınıfı kullandığımızı varsayalım:
class AlbumService
{
public function __construct(private readonly Album $album)
{
}
public function rename(string $newName): void
{
$this->album->update(['name' => $newName]);
}
public function delete(): void
{
$this->album->delete();
}
public function bookmark(): void { // $this->album... }
public function promote(): void { // $this->album... }
public function compare(): void { // $this->album... }
// ...
}
Yapmak istediğim olay Controller içinde tanımladığım değişkenleri de Service sınıfına taşımak:
class AlbumService
{
//...
public function prepareAlbumData(): array
{
return [
'album' => "Beauty Behind The Madness",
'artist' => "The Weeknd"
];
}
//...
}
Bu metodu Controller sınıfında kullanabilmek için aklıma gelen iki çözüm var:
- Service sınıfı
__construct
parametresini nullable
yapmak.
class AlbumService
{
public function __construct(private readonly ?Album $album = null)
{
}
public function prepareAlbumData(): array
{
// ...
}
//...
}
class AlbumController
{
public function index(): View
{
return view('info', (new AlbumService)->prepareAlbumData());
}
}
- Service sınıfı içindeki
prepareAlbumData
metodunu statik olarak tanımlamak.
class AlbumService
{
//...
public static function prepareAlbumData(): array
{
return [
'album' => "Beauty Behind The Madness",
'artist' => "The Weeknd"
];
}
//...
}
class AlbumController
{
public function index(): View
{
return view('info', AlbumService::prepareAlbumData());
}
}
Ancak ikisinden de memnun değilim. Değişkenleri Controller dışında oluşturmanın (ya da konu olan nesneden bağımsız olarak oluşturmanın) daha "OOP" bir yolu var mıdır? Şimdiden teşekkürler.