Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Bir kaç farklı video , birkaç github koduna baktım ve neredeyse hiçkimse dökümantasyondaki
https://laravel.com/docs/10.x/validation#form-request-validation


/**
 * Store a new blog post.
 */
public function store(StorePostRequest $request): RedirectResponse
{
    // The incoming request is valid...
 
    // Retrieve the validated input data...
    $validated = $request->validated();

bu yukarda bulunan $validated = $request->validated(); satırı kullanmıyor sadece $request->content diyerek amacına ulaşıyor ve dogrulamadan geçip geçmediğini gösteriyor ,test ediyor , uyguluyor vs

gercektende form request içindeki tüm kurallar onlarca kere test etmeme ragmen düzgün şekilde çalışıyor
$validated = $request->validated(); --------> $validated['content']; ile bunu kullanmadan direk
$request->content aynı şekilde çalışıyor .

validated() form request içindeki rules e yazılan kuralları denetlemek için değilmi ?

@mgsmus hocadan dan bir alıntı

Form Request kullandığınızda $request->input('content') yerine $request->validated() kullanmanız lazım. Yani şu şekilde:


$data = $request->validated();

$content = $data['content'];

çünkü form request içindeki bazı değişiklikler validated() yöntemi ile gelen parametrelere yansır ama siz input ile çekerseniz validasyonu hiçe sayıp direkt gelen parametreyi almış oluyorsunuz. Yani form request kullanınca $request->input() ile aldığınız parametre validasyondan geçmemiş hali ile çekiliyor, bu güvenlik sorunlarına ya da istenmeyen durumlara sebep olabilir.

input ile çekiyorum validasyonu hiçe saymıyorki rule içindeki tüm kuralları tastamam uyguluyor . biraz kafam karıştı

  • mgsmus bunu yanıtladı.
  • TurkMvc bunu beğendi.
  • yalcin bu yukarda bulunan $validated = $request->validated(); satırı kullanmıyor sadece $request->content diyerek amacına ulaşıyor ve dogrulamadan geçip geçmediğini gösteriyor ,test ediyor , uyguluyor vs

    İyi b*k yiyorlar.

    yalcin input ile çekiyorum validasyonu hiçe saymıyorki rule içindeki tüm kuralları tastamam uyguluyor . biraz kafam karıştı

    $request->input() ile aldığınız alan $request->validated(); içinde varsa sorun yok ama bir alanı form request içine eklemeyi unutabilirsiniz (mesela sonradan eklenen bir sütun). Bu durumda $request->input() validasyon uygulanmamış riskli bir girdiyi verebilir. Diğer en çok yapılan hata ise:

    $validated = $request->validated();
    
     // ...
    
    $user = User::create($request->all()); 

    Geçmiş olsun.

    • mgsmus

      Seviye 1375
    • Düzenlendi
    • En İyi Yanıtyalcin tarafından

    yalcin bu yukarda bulunan $validated = $request->validated(); satırı kullanmıyor sadece $request->content diyerek amacına ulaşıyor ve dogrulamadan geçip geçmediğini gösteriyor ,test ediyor , uyguluyor vs

    İyi b*k yiyorlar.

    yalcin input ile çekiyorum validasyonu hiçe saymıyorki rule içindeki tüm kuralları tastamam uyguluyor . biraz kafam karıştı

    $request->input() ile aldığınız alan $request->validated(); içinde varsa sorun yok ama bir alanı form request içine eklemeyi unutabilirsiniz (mesela sonradan eklenen bir sütun). Bu durumda $request->input() validasyon uygulanmamış riskli bir girdiyi verebilir. Diğer en çok yapılan hata ise:

    $validated = $request->validated();
    
     // ...
    
    $user = User::create($request->all()); 

    Geçmiş olsun.

    ben bu şekilde güncelledim

    public function store(StoreBrandRequest $request)
        {
           $validated = $request->validated();
    
           /* $image=$request->file('image')->store('brand','public'); */
              
         Brand::create([
                'name' => $validated['name'],
                'slug' => Str::slug($validated['name'], '-'),
                'image' => $validated['image']->store('brand','public'),
            ]);
            return to_route('brands.index'); 
        }

      yalcin StoreBrandRequest class'ınızda image kuralına 'exclude' ekleyin.

      Bunu yaptığınızda, doğrulamaya tabii olacak ancak $request->validated() içerisinde yer almayacak.

      Ardından

      $image=$request->file('image')->store('brand','public');

      Brand::create([
      $request->validated() + $image
      ]
      );

      slug sütunu için yaptığınız işlemi StoreBrandRequest içerisinde prepareforValidation() fonk içerisinde yapabilirsiniz.

        BoraN7 Öncelikle teşekkürler

        Bu dd($request); sonucu. Request tüm isteği detaylı veriyor sanrım bir requestin tüm içeriğini veriyor .

        Bu aşşğıdaki ise dd($validated); Özel bir elekten geçiriyor sanırım . Tam terminolojiye hakim değilim neyse artık bir işleme tabi tutuyor birazdaha sadeleştiriyor

        Şu adresde https://laravel-code.tips/you-can-validate-a-field-and-exclude-it-from-the-validated-data/ bir açıklama buldum

        #Laravel Tip: When you need to validate a field, but don't actually require it for anything e.g. 'accept terms and conditions', make use of the 'exclude' rule. That way, the 'validated' method won't return it...

        Türkçesi : #Laravel İpucu: Bir alanı doğrulamanız gerektiğinde, ancak 'şartlar ve koşulları kabul et' gibi herhangi bir şey için gerçekten gerekli olmadığında, 'hariç tut' kuralını kullanın. Bu şekilde, 'doğrulanmış' yöntem onu ​​döndürmez...

        Benim durumumda konu resim ve StoreBrandRequest im

        public function rules(): array
            {
                return [
                    'name' => 'required|unique:brands|min:3|max:15',
                    'image' => 'required|image|max:2048|mimes:jpeg,png,jpg'
                ];
            }
        }

        Ben resimde doğrulansın istiyorum hatta rules içine bundan dolayı o kuralları koydum .
        Not : Sanırım doğrulamadaki image kullandıktan sonra mimes kullanmaya gerek yok emin olamadım genede koydum .
        bu yüzdenden ilgili controllerim

          public function store(StoreBrandRequest $request)
            {
               
               $validated = $request->validated();
                        
             Brand::create([
                    'name' => $validated['name'],
                    'slug' => Str::slug($validated['name'], '-'),
                    'image' => $validated['image']->store('brand','public'),
                ]);
                return to_route('brands.index'); 
            }

        bu şekilde . Neden resme exclude ekliyerek $request->validated() içerisinde yer almamasını sağlıyayım ? validated içinde yer alması daha iyi değilmi alsın işte .

          yalcin Yaptığınızda hatalı bir şey yok.

          Ben sadece kodu kısaltmış oldum;

          Önce resim upload işlemini hallediyoruz.
          Zaten sizin validation içerisindeki alanlardan birinde hata olursa, kod aşağı satıra ulaşmadan 422 hatası ile dönüş yapacak.

          $image içerisinde $validated['image'] şeklinde ayırmanıza gerek yok.
          image alanınız zaten validation içerisinde var, doğrulamadan geçmiş olan veri gelecek burada.

          $image=$request->file('image')->store('brand','public');

          Brand::create([
          $request->validated() + $image
          ]
          );

          Yukarıda, create içerisine upload işleminden sonraki $image değişkenini göndermek istediğim için, exclude kullandım. Bu sayede $request->validated() içerisinde 'image' yer almıyor.

          Ancak validation uygulanıyor. Form Request içerisinde şu şekilde kullanmanız yeterli;

          'image' => 'required|max:2048|mimes:jpeg,png,jpg|exclude'

          Ayrıca mimes ile tip belirtiyorsanız, image kuralına gerek yok.

          Slug kısmını da, Form Request sınıfı içerisindeki prepareForValidation metodunda halledebilirsiniz.

          use Illuminate\Support\Str;
           
          /**
           * Prepare the data for validation.
           */
          protected function prepareForValidation(): void
          {
              $this->merge([
                  'slug' => Str::slug($this->slug),
              ]);
          }

          Artık $request->validated() içerisinde Str::slug'dan geçmiş olan slug değeriniz var. Ayrıca ikinci paremetrede -(tire işareti) kullanmanıza gerek yok, o zaten var sayılan değer.

          Uzun lafın kısası yapınızda hatalı bir şey yok. Ben sadece Brand::create() kısmında içerisinde tek tek key-value uğraşmayın diye kısaltmış oldum.

            @yalcin Bir ek yapayım;

            İlk mesajınızda şunu gördüğüm için bu yapıyı uyguladım;

            /* $image=$request->file('image')->store('brand','public'); */

            Bu, yanlış hatırlamıyorsam DB'ye kayıt ederken

            brands/image-name.jpg şeklinde kayıt eder.

            Form Request'te exclude ederek, $request->validated() dizisinden çıkarıp, kendim + operatörü vasıtası ile $image değişkenini göndererek DB'ye brands/image-name.jpg şeklinde yazmasını sağladım.

            Eğer exclude kullanmadan doğrudan

            Brand::create($request->validated()); yapar isek, (yanlış hatırlamıyorsam) image-name.jpg olarak kayıt eder veritabanınıza.
            Ha tabii bu durumda çağırdığınız yerde brands/.$brand->image vs.. gibi de çağırmanız mümkündür.
            Bu size kalmış.

            Özetle, exlude' olayına girilmeden şu şekilde de yapılabilir herhalde;

            $request->file('image')->store('brand','public'); // resmi storage dizinine upload et
            Brand::create($request->validated());

            Tabii test etmedim, ezbere yazıyorum. Hatam olabilir.

              BoraN7 Ayrıca ikinci paremetrede -(tire işareti) kullanmanıza gerek yok, o zaten var sayılan değer.

              evet varsayılan olarak tire ' imiş ama uyarın sayesinde bir deneyeyim dedim - tire değilde o ikinci parametre _ alt tire olursa ikinci parametrenin bir anlamı oluyor .

              BoraN7 /* $image=$request->file('image')->store('brand','public'); */

              bu kısımda benim VScode ile ilgili olabilir bilemiyorum ama yorum satırını böyle yapıyor bende yorum satırına çevirip form request i uyguladım o kısım kullanımda değil yani 🙂

              BoraN7 Ayrıca mimes ile tip belirtiyorsanız, image kuralına gerek yok.

              yada tam tersi sanırım image kullanınca mimes'e gerek yok .
              Çok teşekkürler