03.01.2021

Laravel App/Storage yerine Public kullanmak

Laravel

Merhaba,

Pek çok kullanıcı laravel projesini VPS sunuclarda barındırmak tabiki en avantajlısı ancak ücretlerin yüksek olması ve Laraveli hobi amaçlı olarak kullanan pek çok kullanıcı projelerini daha düşük maliyetli olan paylaşımlı sunucularda çalıştırmak isityorlar. Ancak paylaşımlı sunucular başta SSH erişimi olmak üzere pek çok özelliği kısıtlı olarak sunuyor. php artisan storage::link komutu da bu sınırlamalara kurban gidenlerden. Basit bir projede resim, video v.b. medyaları depolmak için app/storage klasörü yerine /public/BENİM DOSYAM'a nasıl kayıt yapacağımızı anlatayım.

Dosyal yolunu değiştirme, dosyayı kaydetme ve dosyayı görüntüleme için 3 aşamalı olarak anlatayım.

1-Kendi dosya sistemimizi oluşturalım.

./config/filesystems.php dosyası içerisinde Filessystem Disks bölümünü buluyoruz ve en alta my_files dosya sistemimizi tanımlıyoruz. Hepsi bu kadar.



/*
|--------------------------------------------------------------------------
| Filesystem Disks
|--------------------------------------------------------------------------
|
| Here you may configure as many filesystem "disks" as you wish, and you
| may even configure multiple disks of the same driver. Defaults have
| been setup for each driver as an example of the required options.
|
| Supported Drivers: "local", "ftp", "sftp", "s3", "rackspace"
|
*/

'disks' => [

'local' => [
'driver' => 'local',
'root' => storage_path('app'),
],

'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],

's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
],

'my_files' => [
'driver' => 'local',
'root' => public_path() . '/my_files',
],

artık my_files dosya sistemini kullandığımızda dosyalarımız /public/my_files klasörüne depolanacak ve artık storage:link komutunu kullanmamıza gerek kalmayacak.

Şimdi örenk olarak bir kullanıcı avatarını nasıl yeni sistemi kullanarak kaydettiğimizi görelim.

Form oluştururken

/resources/views/create-avatar.blade.php içerisinde


<form method="POST" action="{{ url('users') }}" accept-charset="UTF-8" class="form-horizontal" enctype="multipart/form-data">           

@csrf

<div class="form-group">   

<label for="avatar" class="control-label">Avatar</label>

<input class="form-control" name="avatar" type="file" id="avatar">

</div>

<div class="form-group">

<input class="btn btn-primary" type="submit">

</div>

</form>

tek form ile dosyamızı gönderebiliriz.

Controller içerisinde Store metodu aşağıdaki gibi olmalıdır. koda dikkat edecek olursanız ->storage olarak avatars tanımladık ve artık üye resimlerimiz /public/my_files/avatars klasörü içerisine kayıt edilecek.


public function store(Request $request){     

$requestData = $request->all();

if ($request->hasFile('avatar')) {

 $requestData['avatar'] = $request->file('avatar')

->store('avatar', ['disk' => 'my_files']); 

      }

}

3- peki view dosyamızda bu kayıtlı avatarı nasıl göstereceğiz?

Hemen blade içerisinde dosyanızı gösterebileceğiniz kodu da aşağıya yazıyorum.


@isset($item->avatar)

<img height="50" src="{{ asset('my_files/'.$item->avatar) }}" />

@endisset

bu kodu direk Blade içierisinde yazınca muhtemelen $item tanımlı değil hatası verecek. Bu yüzden blade dosyasına controller içerisinden

$item = Item::findOrFail($id);

return view('avatars.show', compact('item'));

gibi bir tanımlama yapmak gerekiyor. Her projede tablo yapısı v.b. farklı olacağı için yukarıdaki kodu kendi projenize göre adapte etmeniz gerekiyor.

Sorunuz olursa veya kodları kendi projenize uyarlamakta güçlük çekerseniz aşağıdan yorum bölümüne yazabilirsiniz.

Yazar: Can BAYAT
Kimdir: 2015 yılından bu yana EMD Enerji Merkezi Danışmanlık şirketine bağlı olarak çalışmaktadır. 2016 SAÜ Fen Bilimleri Enstitüsü Jeofizik Mühendisliği Yüksek Lisans mezunudur. Evli ve bir çocuk babasıdır.
| | canbayat [at] gmail |