Yeni Başlayanlar İçin Laravel Eğitimi

⚡ Akıllı Özet

Laravel, Taylor Otwell tarafından web uygulamalarını hızlı ve temiz bir şekilde oluşturmak için geliştirilmiş açık kaynaklı bir PHP MVC çerçevesidir. Bu eğitimde Laravel'in ne olduğu, Composer ile nasıl kurulacağı ve rotalar, denetleyiciler, form isteği doğrulaması ve Blade şablonları kullanılarak çalışan bir dosya yükleme uygulamasının nasıl oluşturulacağı açıklanmaktadır.

  • ???? Laravel Nedir: Laravel, hızlı geliştirme için paket yöneticisi, veritabanı araçları ve etkileyici sözdizimine sahip modern bir PHP MVC çerçevesidir.
  • ???? Composer Kurulumu: Composer, Laravel'i kurar; `laravel new` komutu, tam dizin yapısıyla yepyeni bir uygulama oluşturur.
  • 🧭 Rotalar: routes/web.php dosyasındaki rotalar, bir URI ve HTTP fiilini bir denetleyici yöntemine eşler ve akılda kalıcı isimler verilebilir.
  • 🎛️ Kontrolörler: Bir denetleyici isteği alır ve bir yanıt döndürür, keeping Eylem mantığı, rota tanımlarından ayrıdır.
  • ✅ Form Talepleri: Form isteği sınıfı doğrulama kurallarını içerir, bu nedenle geçersiz veriler denetleyiciye ulaşmadan önce reddedilir.
  • 🖼️ Bıçak Şablonları: Blade, @csrf ve route() gibi yönergelerle HTML oluşturur; burada asenkron yüklemeler için jQuery ile birlikte kullanılır.
  • 🤖 Yapay Zeka Yardımı: Yapay zeka araçları, bir Laravel CRUD uygulamasının iskeletini oluşturabilir ve eski bir projenin mevcut Laravel sürümüne yükseltilmesine yardımcı olabilir.

Laravel Eğitimi

Laravel nedir?

laravel PHP için açık kaynaklı bir web MVC çerçevesidir. Laravel, özel bir bağımlılık yöneticisine sahip modüler paketleme sistemi, ilişkisel veritabanlarına erişim ve uygulama dağıtımı ve bakımına yönelik diğer yardımcı programlar gibi özelliklerle PHP web uygulamalarının kolay geliştirilmesini sağlayan güçlü bir çerçevedir.

Laravel, Taylor Otwell tarafından oluşturulmuştur. Haziran 2011'deki ilk sürümünden (versiyon 1) bu yana, web geliştirme sektörünün PHP framework'leri alanında giderek daha popüler hale gelmiştir. Bu popülaritenin büyük bir kısmı, varsayılan olarak sunduğu geliştirici odaklı birçok özelliğe bağlanabilir.

Neden Laravel?

Yaklaşık 2000, çoğu PHP kodu prosedürseldi ve karmaşık bir spagetti kodu karmaşasına sahip "senaryolar" biçiminde bulunabilirdi. En basit sayfalarda bile yoktu endişelerin ayrılmasıBu nedenle, bir uygulamanın hızla bakım kabusuna dönüşmesi oldukça kolaydı. Dünya daha iyi bir şeye ihtiyaç duyuyordu. İşte burada PHP sürüm 5 ve çeşitli web uygulaması sorunlarına çok ihtiyaç duyulan bir yapı ve daha iyi çözümler getirmeye çalışan çeşitli PHP çerçeveleri devreye giriyor.

O zamandan beri, günümüzde kullanılan popüler framework'lerin yolunu açan birçok framework piyasaya sürüldü. Bugün, (bizim görüşümüze göre) en iyi üçü Zend Framework, Symfony ve elbette Laravel'dir. Bu framework'lerin her biri benzer prensipler üzerine kurulmuş ve (temelde) aynı ortak sorunları çözmeye yönelik olsa da, temel farklılıkları uygulamalarında yatmaktadır. Her birinin sorunları çözme konusunda kendine özgü özellikleri vardır. Her birinin ürettiği koda baktığınızda, onları birbirinden ayıran oldukça belirgin bir çizgi olduğunu göreceksiniz. Bizim mütevazı görüşümüze göre, Laravel framework'ü en iyisidir.

Hakkında daha fazla bilgi edinin Laravel ile arasındaki fark Codeateşleyici.

Composer ile Laravel Nasıl İndirilir ve Kurulur

Not: Bu eğitim Laravel 5.8 için yazılmıştır, ancak yönlendirme, denetleyici, istek ve Blade kavramları mevcut sürümlerde de aynı kalmaktadır. 2026 itibariyle en son sürüm Laravel 13'tür (Mart 2026'da yayınlandı) ve PHP 8.3 veya daha üstünü gerektirirken, Laravel 12 PHP 8.2 gerektirir.

Not: PHP'nin yerel sisteminize zaten kurulu olduğunu varsayıyoruz. Kurulu değilse, nasıl kurulacağına dair bilgileri okuyabilirsiniz. okuyun.

Composer hem paket hem de bağımlılık yöneticisidir. Yüklemek için bir terminal açın ve yeni bir dizine cd ekleyin. Bu komutu çalıştırın:

curl -Ss getcomposer.org/installer | php

Bu komutun sonuçları şöyle görünecektir:

Laravel'i Composer ile indirin ve yükleyin

Not: Laravel kurulumuyla ilgili daha ayrıntılı talimatlar için Laravel dokümanına bakın. okuyun.

Laravel'i kurmak için kullandığımız composer.phar betiğinin indirilip derlendiğini göreceksiniz. Yeni bir Laravel uygulaması kurmanın birçok yolu olsa da, biz bunu Laravel composer betiği aracılığıyla yapacağız. Bu betiği kurmak için şu komutu çalıştırın:

composer global require laravel/installer

Hangisi şuna benzeyecek:

Laravel'i Composer ile indirin ve yükleyin

Bu işlem, çerçeve dosyalarının tamamını ve gerektirdiği tüm bağımlılıkları indirip kuracaktır. Paketler vendor dizinine kaydedilecektir. İndirme ve kurulum tamamlandıktan sonra, aşağıdaki komutu vermek kadar kolaydır:

laravel new uploadApp

Aşağıdakine benzer bir çıktı göreceksiniz:

Laravel'i Composer ile indirin ve yükleyin

Composer, Laravel'in çalışması için gereken tüm paketleri yüklüyor. Bu işlem birkaç dakika sürebilir, bu yüzden sabırlı olun. İşlem tamamlandıktan sonra, yüklenen paketlere göz atmak için `ls -al` komutunu çalıştırın.

Yaygın bir Laravel uygulamasındaki dizinlerin kısa bir dökümü aşağıda verilmiştir:

  • uygulama/ : Bu, uygulamamızın kodunun bulunduğu kaynak klasörüdür. Tüm denetleyiciler, politikalar ve modeller bu klasörün içindedir.
  • önyükleme/ : Uygulamanın başlatma betiğini ve birkaç sınıf eşleme dosyasını içerir.
  • yapılandırma/: Uygulamanın yapılandırma dosyalarını içerir. Bunlar genellikle doğrudan değiştirilmez, bunun yerine uygulamanın kök dizinindeki .env (ortam) dosyasında ayarlanan değerlere bağlıdır.
  • veri tabanı/ : Veritabanı dosyalarını (migration'lar, seed'ler ve test factory'ler dahil) barındırır.
  • halk/ : Derlenmiş dosyaları ve elbette bir index.php dosyasını içeren, herkese açık klasör.
  • kaynaklar/ : Aşağıdaki gibi ön uç varlıkları içerir: JavaUygulamada kullanılan komut dosyası dosyaları, dil dosyaları, CSS/SASS dosyaları ve tüm şablonlar (Blade şablonları olarak adlandırılır).
  • rotalar/ : Uygulamadaki tüm rotalar burada yer almaktadır. Rotaların birkaç farklı "kapsamı" vardır, ancak biz web.php dosyasına odaklanacağız.
  • depolamak/ : Uygulama tarafından kullanılan tüm geçici önbellek dosyaları, oturum dosyaları, derlenmiş görünüm komut dosyaları ve günlük dosyaları.
  • testler/ : Uygulama için birim testleri ve fonksiyonel testler gibi test dosyalarını içerir.
  • SATICI/ : Composer ile tüm bağımlılık paketleri kuruldu.

Şimdi, uygulamanın geri kalanını oluşturalım ve özel bir Artisan komutuyla çalıştıralım (Apache veya Nginx gibi bir web sunucusu kurma ve yapılandırma zahmetinden kurtulmak için). .env dosyası, /config dizinindeki dosyaların uygulamayı yapılandırmak için kullandığı tüm yapılandırma değerlerini içerir.

Uygulama tasarımı: Gereksinimlerimizin hızlı bir özeti

Bu çevrimiçi Laravel eğitiminde yalnızca iki şeyi yapacak çok basit bir uygulama geliştireceğiz:

  1. bir web formundan dosya yüklemelerini yönetme
  2. Daha önce yüklenen dosyaları farklı bir sayfada görüntüleyin.

Bu proje için uygulamamız yalnızca yazma işlemine izin verecek şekilde tasarlanmıştır; yani kullanıcı yalnızca dosya yazabilir ve yüklediği dosyaların listesini görüntüleyebilir. Bu uygulama son derece basittir ancak Laravel becerilerinizi ve bilginizi geliştirmeye başlamanız için iyi bir alıştırma niteliğinde olacaktır. Kısa olması açısından veritabanı modellemesi, migration'lar ve kimlik doğrulama gibi konuları hariç tuttuk, ancak gerçek bir uygulamada bunlar dikkate almanız gereken ek unsurlardır.

Uygulamanın beklendiği gibi çalışmasını sağlamak için ihtiyaç duyacağımız bileşenlerin listesi:

  • A degistirebilirsin. Bu, dış dünyanın (internet) uygulamayı kullanmasına olanak tanıyacak ve yüklenen dosyanın kaydedilmesi için gereken mantığın bulunduğu uç noktayı belirtecektir.
  • A kontrolör İstek-yanıt akışını yöneten kısım.
  • A şablon Bu, daha önce yüklenmiş dosyaların listesini ve yükleme formunun kendisini görüntülemek için kullanılacaktır.
  • A talep Denetleyicinin web formundan gelen verileri doğrulamak için kullanacağı yöntem.

Rota Nedir?

Laravel'de bir rota, temelde bir URI ile belirtilen ve uygulamanın sunduğu bir işlevselliğe "işaretçi" görevi gören bir uç noktadır. Çoğunlukla, bir rota basitçe bir denetleyicideki bir metoda işaret eder ve ayrıca hangi HTTP yöntemlerinin bu URI'ye erişebileceğini belirler. Bir rota her zaman bir denetleyici metodu anlamına gelmez; uygulamanın yürütülmesini tanımlanmış bir Closure'a veya anonim bir fonksiyona da aktarabilir.

Rota kullanmanın nedenleri nelerdir?

Rotalar, projenin kök dizinindeki /routes klasörü altındaki dosyalarda saklanır. Varsayılan olarak, uygulamanın farklı "taraflarına" karşılık gelen birkaç farklı dosya vardır ("taraflar" altıgen mimari metodolojisinden gelir). Bunlar şunları içerir:

  • web.php: Tarayıcıya açık, herkese açık "tarayıcı" tabanlı rotalar. Bunlar en yaygın olanlardır ve web tarayıcısı tarafından erişilen rotalardır. Web ara katman yazılım grubu üzerinden çalışırlar ve ayrıca şu olanakları da içerirler: CSRF koruması (bu da form tabanlı kötü amaçlı saldırılara karşı savunmaya yardımcı olur) ve genellikle bir dereceye kadar "durum" içerirler (bununla oturumları kullandıklarını kastediyoruz).
  • api.php: Bir API grubuna karşılık gelen ve bu nedenle API ara yazılımı varsayılan olarak etkinleştirilmiş olan rotalar. Bu rotalar durumsuzdur ve oturum veya istekler arası bellek paylaşımı yoktur (bir istek, başka bir istekle veri veya bellek paylaşmaz; her biri kendi içinde kapsüllenmiştir).
  • console.php: Bu rotalar, uygulamanız için oluşturduğunuz özel Artisan komutlarına karşılık gelir.
  • channels.php: Etkinlik yayınlamak için rotaları kaydeder.

Bu aşamada üzerinde durulması gereken en önemli dosya, tarayıcıya özgü olan web.php dosyasıdır. Varsayılan olarak tanımlanmış bir rota zaten mevcuttur; bu rota, uygulamanızın web kök dizinine (web kök dizini public dizinindedir) gittiğinizde doğrudan eriştiğiniz rotadır. Yükleme uygulamamızın çalışması için üç farklı rotaya ihtiyacımız olacak:

  • /upload: Bu, dosya yükleme için web formumuzu görüntüleyen ana sayfanın URI'si olacaktır.
  • /process: Bu, /upload URI'sinde bulunan formun gönderilen verilerini (formun "işlemi") buraya göndereceği yerdir.
  • /list: Bu komut, siteye yüklenen tüm dosyaları listeleyecektir.

Not: Yükleme formunu ve dosya listesini görüntüleme mantığını tek bir sayfada birleştirmek isteseydik, /list uç noktasına ihtiyaç duyulmayabilirdi; ancak, konuya biraz daha içerik katmak için şimdilik bunları ayrı tuttuk.

//inside routes/web.php
Route::get('/upload', 'UploadController@upload')->name('upload');
Route::get('/download', 'UploadController@download')->name('download');
Route::post('/process', 'UploadController@process')->name('process');
Route::get('/list', 'UploadController@list')->name('list');

Bu Laravel framework eğitiminde, istenen her rota için, mevcut HTTP'ye özgü istek yöntemlerinden (get(), post(), put(), delete(), patch() veya options()) birini kullanarak rotayı web.php dosyasında açıkça listeleyeceğiz. Bunların her birinin ayrıntılı açıklaması için ilgili bölüme bakın. Re-Tweet Bu yöntemler, belirli bir rotaya hangi HTTP fiillerinin erişmesine izin verildiğini belirtir. Bir rotanın birden fazla HTTP fiilini kabul edebilmesi gerekiyorsa (örneğin, hem ilk verileri görüntülemek hem de gönderilen form verilerini göndermek için tek bir sayfa kullanıyorsanız), Route::any() yöntemini kullanabilirsiniz.

Hem Route::get() hem de Route::post() yöntemlerinin (ve Route facade'indeki diğer HTTP fiilleriyle ilgili yöntemlerin) ikinci argümanı, belirli bir denetleyicinin adı ve bu denetleyici içinde yer alan ve izin verilen HTTP isteğiyle (GET, POST, PATCH, vb.) rotanın uç noktasına ulaşıldığında çalıştırılan yöntemdir. Tüm rotalar için UploadController'ı kullanıyoruz ve bunları aşağıdaki şekilde belirttik:

Rota Nedir?

Her rotada çağırdığımız son yöntem, tek bir dizeyi argüman olarak alan ve belirli bir rotayı hatırlaması kolay bir isimle (bizim örneklerimizde upload, process ve list) "etiketlemek" için kullanılan name() fonksiyonudur. Her rotaya kendi adını vermek, görünüşte çok da harika bir özellik gibi görünmeyebilir. URL Adı tamamen aynı, ancak /users/profile/dashboard/config gibi belirli bir rotanız olduğunda, profile-admin veya user-config gibi hatırlaması daha kolay olacağı için gerçekten işe yarıyor.

Cephelerle ilgili bir not:

  • Cepheler, uygulamanın servis konteynerinde bulunan sınıflara "statik" bir arayüz sağlar.
  • Manuel olarak eklenmesi veya yapılandırılması gereken uzun sınıf adlarını hatırlamadan Laravel'in özelliklerini kullanmanıza olanak tanıyan kısa ve akılda kalıcı bir sözdizimi sağlarlar.

Yukarıdaki rota tanımlarında, yeni bir Illuminate/Routing/Router nesnesi manuel olarak oluşturup bu nesne üzerindeki ilgili yöntemleri çağırmak yerine Route facade'ini kullanıyoruz. Bu sadece zaman kazandıran bir kısayoldur.pingLaravel framework'ünde cephe (facade) yapıları yoğun olarak kullanılmaktadır; bu nedenle onlarla daha yakından tanışmalısınız. Cephe yapılarıyla ilgili belgelere şu adresten ulaşabilirsiniz: okuyun.

Denetleyici Nedir?

Bir kontrolcü, Laravel'in dayandığı "MVC" (Model-View-Controller) mimarisindeki "C"dir. Bir kontrolcünün işi bu basit tanıma indirgenebilir: İstemciden gelen isteği alır ve istemciye yanıt gönderir. Bu, en temel tanımdır ve aynı zamanda herhangi bir denetleyicinin minimum gereksinimidir. Bu iki şey arasında yaptığı şey genellikle denetleyicinin "eylemi" (veya "rotanın uygulaması") olarak kabul edilir. İstemci için uygulamaya ikinci giriş noktası (birincisi istek) görevi görür; istemci, bir tür yanıt (başarı sayfası, yönlendirme, hata sayfası veya başka herhangi bir HTTP yanıtı şeklinde) bekleyerek uygulamaya istek yükünü (bir sonraki bölümde ele alacağız) gönderir.

Bir denetleyici (controller), temelde, bir rota tanımıyla aynı şeyi yapar; ancak bu rotaya erişildiğinde "eylem" olarak anonim bir fonksiyon atanır. Aradaki fark, denetleyicinin sorumlulukların ayrılması ilkesine iyi uyum sağlamasıdır, oysa bir rota gerçek rotaya doğrudan bağlı olarak tanımlanır. URL Tanım gereği, rotaya atanan URI'yi rotanın uygulamasıyla veya o rotaya erişildiğinde çalışan kodla eşleştiriyoruz.

Örneğin, aşağıdaki iki kod parçası aynı işi yapacaktır:

Örnek 1: Tek bir yöntem çağrısında rotanın tanımı ve uygulanması (web.php yönlendirme dosyasında)

//inside routes/web.php
<?php
Route::get('/hello-world', function(Request $request) {
$name = $request->name;
return response()->make("<h1>Hello World! This is ".$name, 200);
});

Örnek #2: Rota tanımı routes/web.php dosyasında yer alırken, uygulaması /app/Http/Controllers/HelloWorldController sınıfında bulunmaktadır.

//inside routes/web.php
<?php

Route::get('/hello-world', 'HelloWorldController@index')->name('hello-world');

------------------------------------------------------------------------------------
//inside app/Http/Controllers/HelloWorldController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class HelloWorldController extends Controller
{
public function index(Request $request)
{
$name = $request->name;
return response()->make("<h1>Hello World! This is ".$name, 200);
}
}

Laravel örneği #2 çok daha fazla iş gibi görünse de (aslında öyle değil, sadece biraz daha fazla kod), verilen "hello-world" rotası için eylem mantığımızı bir geri çağırma fonksiyonu olarak tanımlamak yerine bir denetleyici içine yerleştirmenin sağladığı avantajlara bakın:

  1. Mantığımız, kendi başına ayrı bir sınıf olarak net bir şekilde ayrılmıştır (işlevlerin ayrılması).
  2. Kontrolcümüz, ileride ek özellikler eklememiz gerekirse genişletilebilecek şekilde yapılandırılmıştır. Örneğin, "dünyaya veda" özelliği eklemek istediğimizi varsayalım. Bu durumda, kontrolcüyü daha genel bir isim olan "HelloController" olarak yeniden adlandırır ve ardından iki ayrı yöntem tanımlarız. Merhaba() hem de Güle güle(). Ayrıca haritayı haritalayan iki ayrı rota tanımlamamız gerekir. /Merhaba hem de / Güle güle URI'ler, denetleyicideki uygun yöntemlere yönlendirilir. Bu, her rotanın uygulamasının geri çağırma fonksiyonları olarak tanımlandığı, şişirilmiş bir rota dosyası oluşturmaya kıyasla tercih edilir.
  3. Laravel, belirli bir rotayı bulmak için gereken süreyi hızlandıracak şekilde uygulamadaki tüm rota tanımlarını önbelleğe alma yerleşik yeteneğine sahiptir (uygulama performansını artırır); Bununla birlikte, Bu özellikten yalnızca uygulamanız içindeki tanımlı tüm rotalarınız denetleyiciye özgü harita kullanılarak yapılandırılmışsa yararlanabilirsiniz.ping(Yukarıdaki Örnek #2'ye bakınız).

Şimdi bu komutu çalıştıralım, bu komut bizim için yeni bir kontrol cihazı oluşturacaktır.

// ...inside the project's root directory:
php artisan make:controller UploadController

Esasen, bu komut, ana denetleyici dizininde /app/Http/Controllers/UploadController.php adresinde "UploadController" adlı bir denetleyici için bir taslak oluşturur. Bu dosyayı açıp inceleyebilirsiniz. Çok basittir çünkü yalnızca doğru ad alanı yoluna ve miras aldığı gerekli sınıflara sahip, taslak halindeki bir denetleyici sürümüdür.

Talebin Oluşturulması

Bu PHP Laravel eğitiminde ilerlemeden ve UploadController'ın oluşturduğu kodda birkaç değişiklik yapmadan önce, öncelikle istek sınıfını oluşturmak daha mantıklı olacaktır. Bunun nedeni, isteği işleyen denetleyici yönteminin, gelen form verilerini otomatik olarak doğrulayabilmesi için (rules() yönteminde belirtildiği gibi; daha sonra bunun hakkında daha fazla bilgi vereceğiz) imzasında istek nesnesini tür ipucu olarak belirtmesi gerektiğidir. Şimdilik, istek kodumuzu oluşturmak için tekrar artisan komutunu kullanalım:

php artisan make:request UploadFileRequest

Bu komut, app/Http/Requests/UploadFileRequest klasöründe UploadFileRequest adında bir dosya oluşturacaktır. Bu dosyayı açıp içeriğine göz atın. Çok basit olduğunu, yalnızca authorize() ve rules() olmak üzere iki metot içerdiğini göreceksiniz.

Doğrulama Mantığını Oluşturma

Uygulamamızın ihtiyaçlarını karşılamak için istek taslağını değiştirelim. Dosyayı aşağıdaki gibi görünecek şekilde düzenleyin:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UploadFileRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'fileName' => 'required|string',
'userFile' => 'required|file'
];
}
}

Çok fazla değişiklik yok, ancak authorize() metodunun artık false yerine true döndürdüğüne dikkat edin. Bu metot, isteğin uygulamaya girip girmeyeceğine karar verir. False olarak ayarlanırsa, isteğin sisteme girmesini engeller. Bu, kullanıcı üzerinde yetkilendirme kontrolleri veya isteğin denetleyiciye ilerleyip ilerleyemeyeceğine karar verebilecek diğer mantıkları yerleştirmek için çok kullanışlı bir yer olurdu. Şimdilik, her şeyin isteği kullanmasına izin vermek için burada sadece true döndürüyoruz.

Diğer yöntem olan rules() ise doğrulama konusunda tüm sihrin devreye girdiği yerdir. Fikir basit: şu biçimde bir dizi kural içeren bir dizi döndürmek:

'formFieldName' => 'constraints this field has separated by pipe characters (|)'

Laravel tarafından kutudan çıktığı haliyle desteklenen birçok farklı doğrulama kısıtlaması vardır. Bunların tam listesi için çevrimiçi belgelere bakın okuyunYükleme uygulamamızda, ön uçtaki bir formdan POST isteğiyle iletilen iki alan olacak. `fileName` parametresi form gövdesine dahil edilmelidir (yani zorunludur) ve dosyayı depolama alanında saklayacağımız dosya adı olarak kullanılır (bu işlem denetleyicide yapılır; buna biraz sonra değineceğiz). Ayrıca, dosya adının bir dize olması gerektiğini, dikey çizgi karakteri (|) ve 'string' kelimesini ekleyerek belirtiyoruz. Kısıtlamalar her zaman dikey çizgilerle sınırlandırılır, bu da verilen alan için ek kriterleri tek bir satırda belirtmenize olanak tanır.

İkinci parametre olan userFile, kullanıcının bir web sayfasındaki formdan yüklediği gerçek dosyadır. userFile da zorunludur ve , eğer mülteci statüleri sona erdirilmemişse Amerika'ya geldikten bir yıl sonra bir dosya olsun. Not: Yüklenen dosyanın bir resim olmasını bekliyor olsaydık, dosya türlerini popüler resim türlerinden (jpeg, png, bmp, gif veya svg) biriyle sınırlayan resim kısıtlamasını kullanırdık. Kullanıcının herhangi bir dosya türünü yüklemesine izin vermek istediğimiz için, dosya doğrulama kısıtlamasıyla yetineceğiz.

İstek nesnesinin temel işlevi bu kadar. Ana görevi, formun gövde parametrelerinin uygulamada daha derinlere inmek için karşılaması gereken kabul edilebilir kriterler (kısıtlamalar) kümesini tutmaktır. Dikkat edilmesi gereken bir diğer nokta ise, bu iki alanın (userFile ve fileName) HTML kodunda da giriş alanları şeklinde (alan adı istek nesnesindeki adla eşleşen şekilde) belirtilmesi gerektiğidir.

Şöyle soruyor olabilirsiniz: Bu, bir form isteğinin ne içermesi gerektiğinin özelliklerini tanımlıyor, ancak bu kısıtlamaların gerçek kontrolü nerede yapılıyor? Buna bir sonraki bölümde değineceğiz.

Denetleyiciyi Değiştirme

app/Http/Controllers/UploadController'ı açın ve aşağıdaki değişiklikleri yapın:

<?php

namespace App\Http\Controllers;

use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Http\Request;
use App\Http\Requests\UploadFileRequest; //our new request class
use Illuminate\Support\Facades\Storage;

class UploadController extends Controller
{
/**
* This is the method that will simply list all the files uploaded by name and provide a
* link to each one so they may be downloaded
*
* @param $request : A standard form request object
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @throws BindingResolutionException
*/
public function list(Request $request)
{
$uploads = Storage::allFiles('uploads');

return view('list', ['files' => $uploads]);
}

/**
* @param $file
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
* @throws BindingResolutionException
*/
public function download($file)
{
return response()->download(storage_path('app/'.$file));
}

/**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @throws BindingResolutionException
*/
public function upload()
{
return view('upload');
}

/**
* This method will handle the file uploads. Notice that the parameter's typehint
* is the exact request class we generated in the last step. There is a reason for this!
*
* @param $request : The special form request for our upload application
* @return array|\Illuminate\Http\UploadedFile|\Illuminate\Http\UploadedFile[]|null
* @throws BindingResolutionException
*/
public function process(UploadFileRequest $request)
{
//At this point, the parameters passed into the $request (from form) are
//valid--they satisfy each of the conditions inside the rules() method

$filename = $request->fileName; //parameters have already been validated
$file = $request->file('userFile'); //so we don't need any additional isset()

$extension = $file->getClientOriginalExtension(); //grab the file extension
$saveAs = $filename . "." . $extension; //filename to save file under

$file->storeAs('uploads', $saveAs, 'local'); //save the file to local folder

return response()->json(['success' => true]); //return a success message
}
}

Dolayısıyla, yüklenen dosyaları diske kaydetmek oldukça basit bir yöntemdir. Yukarıdaki process() yönteminin ayrıntılı açıklaması şöyledir:

  • Ana işlevi gerçekleştiren denetleyici yönteminde istek sınıfını tür ipucu olarak belirtin, böylece gelen verileri otomatik olarak doğrulayabiliriz.
  • Denetleyici metodu içinde (artık doğrulanmış olan) istek nesnesinden dosyayı alın.
  • İstekten dosya adını alın.
  • Dosyayı altına kaydetmek için kullanılacak son dosya adını oluşturun. getClientOriginalExtension() yöntemi yalnızca yüklenen dosyanın orijinal uzantısını alır.
  • Dosyayı, saveAs() yöntemini kullanarak yerel dosya sisteminde saklayın; /storage dizini içindeki adlandırılmış yolu 1. argüman olarak ve altına kaydedilecek dosya adını da ikinci argüman olarak iletin.
  • İsteğin başarılı olduğunu belirten bir JSON yanıtı döndürün.

Bıçak Şablonu

Bu yapbozun son önemli parçası, tüm HTML, CSS ve JavaBasit uygulamamız için kod parçası. İşte kod; daha sonra açıklayacağız.

<body>
<h1>Upload a file</h1>
<form id="uploadForm" name="uploadForm" action="{{route('process')}}" enctype="multipart/form-data">
@csrf
<label for="fileName">File Name:</label>
<input type="text" name="fileName" id="fileName" required /><br />
<label for="userFile">Select a File</label>
<input type="file" name="userFile" id="userFile" required />
<button type="submit" name="submit">Submit</button>
</form>
<h2 id="success" style="color:green;display:none">Successfully uploaded file</h2>
<h2 id="error" style="color:red;display:none">Error Submitting File</h2>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
$('#uploadForm').on('submit', function(e) {
e.preventDefault();
var form = $(this);
var url = form.attr('action');
$.ajax({
url: url,
type: "POST",
data: new FormData(this),
processData: false,
contentType: false,
dataType: "JSON",
success: function(data) {
$("#fileName").val("");
$("#userFile").val("");
}
}).done(function() {
$('#success').css('display', 'block');
window.setTimeout(()=>($("#success").css('display', 'none')), 5000);
}).fail(function() {
$('#error').css('display', 'block');
window.setTimeout(()=>($("#error").css('display', 'none')), 5000);
});
});
</script>
</body>
</html>

İşte bizim /yüklemek sayfa şuna benziyor:

Bıçak Şablonu

Bu, bir HTML formu içeren blade dosyasının çok tipik bir örneğidir ve JavaSayfanın yenilenmesini önleyerek eşzamansız işlevsellik eklemek için kullanılan Script/jQuery kodu. Temel bir yapısı var. Method özniteliği olmayan (ki bunu birazdan açıklayacağız) ve {{route('process')}} değerine sahip ilginç bir action özniteliği içeren bir etiket. Blade'de bu, şu şekilde bilinir: Direktif. Yönerge (directive), aslında bir fonksiyon için kullanılan süslü bir isimdir; bunlar, web sayfaları ve web uygulamaları oluşturmada yaygın olarak kullanılan farklı işlemleri gerçekleştiren, Blade şablonlarına özgü fonksiyonlardır. Blade'in yapabileceği tüm faydalı şeyleri daha iyi anlamak için belgelere göz atın. okuyunYukarıdaki örnekte, bir rota oluşturmak için rota yönergesini kullanıyoruz. URL Form gönderimimiz için.

Unutmayın ki, rotalarımızı daha önce web.php dosyasında tanımlamış ve her birine kolay hatırlanabilir bir isim vermiştik. {{route()}} yönergesi bir rotanın adını kabul eder, dahili olarak önbelleğe alınmış rota listesinde arar ve tam bir rota oluşturur. URL Bu, web.php dosyasındaki ilgili rotanın tanımına dayanmaktadır. İlk durumda, formun gönderdiği verileri /process adresine göndermesini istediğimizi belirtiyoruz. URL Uygulamamızın, şu şekilde tanımlanan bir özelliğidir: POST rota.

Fark etmiş olabileceğiniz bir diğer şey ise açılış form etiketinin hemen altında yer alan @csrf etiketidir. Blade'de bu etiket, formda bir _token parametresi oluşturur ve bu parametre, form verilerinin işlenmesine izin verilmeden önce uygulama içinde kontrol edilir. Bu, form içindeki verilerin geçerli bir kaynaktan geldiğinden emin olmayı ve siteler arası istek sahteciliği saldırılarını önlemeyi sağlar. Bu konu hakkında daha fazla bilgi için bkz. docs.

Bundan sonra formumuzu normal şekilde tanımlıyoruz; ancak, form parametrelerimizin adlarının, userFile ve fileName'ın, aynı olduğunu unutmayın. Aynı tam İstek nesnemizde tanımlandığı gibi. İstek nesnesinde tanımlanan belirli bir parametre için bir giriş eklemeyi unutursak (veya yanlış yazarsak), istek başarısız olur ve bir hata döndürülür; bu da orijinal form isteğinin UploadController@process adresinde bulunan denetleyici yöntemine ulaşmasını engeller.

Hemen deneyin ve bu formu kullanarak uygulamaya birkaç dosya gönderin. Ardından, şuraya gidin: /liste Yüklediğiniz dosyaların bir tabloda listelendiği yükleme klasörünün içeriğini görmek için sayfa:

Bıçak Şablonu

Bigger Picture

Şimdi bir adım geri atalım ve bu Laravel eğitiminde neler yaptığımıza bakalım.

Bu diyagram, uygulamanın şu anki halini (üst düzey detaylar hariç) göstermektedir:

Laravel öğretici diyagramı

Laravel eğitiminin başında oluşturduğumuz istek nesnesinin, blade şablonundaki formda tanımlanan parametrelerle aynı parametrelere sahip olması gerektiğini hatırlamalısınız (eğer değilse, "Doğrulama Mantığını Oluşturma" bölümünü tekrar okuyun). Kullanıcı, blade şablon motoru aracılığıyla oluşturulan bir web sayfasındaki formu doldurur ve gönderir. Şablonun altındaki jQuery kodu, varsayılan gönderimi (otomatik olarak ayrı bir sayfaya yönlendirecek olan) durdurur, bir Ajax isteği oluşturur, isteği form verileri ve yüklenen dosya ile yükler ve tümünü uygulamamızın ilk katmanına, yani isteğe gönderir.

İstek nesnesi, rules() metodu içindeki parametrelerin gönderilen form parametreleriyle ilişkilendirilmesiyle doldurulur ve ardından veriler belirtilen her kurala göre doğrulanır. Tüm kurallar karşılanırsa, istek, web.php rota dosyasında tanımlanan değerlere karşılık gelen denetleyici metoduna iletilir. Bu durumda, işi UploadController'ın process() metodu yapar. Denetleyiciye ulaştığımızda, isteğin doğrulamayı geçtiğini zaten biliyoruz, bu nedenle verilen dosya adının gerçekten bir dize olup olmadığını veya userFile parametresinin gerçekten bir dosya türü içerip içermediğini yeniden test etmemize gerek yok. Normal şekilde devam edebiliriz.

Denetleyici metodu daha sonra doğrulanmış parametreleri istek nesnesinden alır, geçirilen fileName parametresini userFile'ın orijinal uzantısıyla birleştirerek tam bir dosya adı oluşturur, dosyayı uygulamamızdaki bir dizine kaydeder ve ardından isteğin başarılı olduğunu doğrulayan basit bir JSON kodlu yanıt döndürür. Yanıt, jQuery mantığı tarafından alınır ve bu mantık, başarı (veya hata) mesajını 5 saniye boyunca gösterme, ardından gizleme ve önceki form girişlerini temizleme gibi birkaç kullanıcı arayüzüyle ilgili görevi daha yerine getirir. Böylece kullanıcı, isteğin başarılı olduğundan emin olur ve isterse başka bir dosya yükleyebilir.

Ayrıca, yukarıdaki diyagramda istemci ve sunucu arasındaki çizginin tam olarak nerede çizildiğine dikkat edin. Bu kavramı anlamanız son derece önemlidir ve örneğin, herhangi bir anda meydana gelebilecek birden fazla eşzamansız isteği yönetirken gelecekte karşılaşabileceğiniz sorunları çözmenize yardımcı olacaktır. Ayrım, istek nesnesinin sınırında yer almaktadır. İstek nesnesinin kendisi, uygulamanın geri kalanına açılan "geçit" olarak düşünülebilir. Web tarayıcısından gelen form değerlerinin ilk doğrulamasını ve kaydını yapar. Geçerli kabul edilirse, denetleyiciye devam eder. Bundan önceki her şey ön uçtadır ("istemci" kelimenin tam anlamıyla "kullanıcının bilgisayarında" anlamına gelir). Yanıt, uygulamadan istemci tarafına geri döndürülür ve burada jQuery kodumuz sabırla yanıtın gelmesini bekler ve aldıktan sonra birkaç basit kullanıcı arayüzü görevi gerçekleştirir.

Ayrıca sıkça sorulan birçok önemli soruyu da ele aldık. Laravel ve PHP ile ilgili röportaj soruları Yeni başlayanların yanı sıra deneyimli adayların da doğru işi bulmaları için.

SSS

Eloquent, Laravel'in yerleşik nesne-ilişki eşleyicisidir. Her veritabanı tablosu bir model sınıfına eşlenir, böylece satırları PHP nesneleri olarak okur ve yazarsınız, örneğin User::find(1) gibi, yaygın işlemler için ham SQL yazmak yerine.

Artisan, Laravel'in komut satırı aracıdır. `make:controller` ve `make:request` gibi komutlarla kod iskeleti oluşturur, geçişleri çalıştırır, önbellekleri temizler ve `php artisan serve` ile yerel bir sunucu başlatarak yaygın geliştirme görevlerini hızlandırır.

Ara katman (middleware), HTTP isteklerini bir rotaya ulaşmadan önce ve yanıtları çıkış yolunda inceleyen veya filtreleyen bir katmandır. Kimlik doğrulama, CSRF koruması ve günlük kaydı gibi genel konuları, rota veya grup bazında uygulayarak ele alır.

Evet. Modelinizi ve alanlarınızı tanımlayın, yapay zeka Laravel kurallarına uygun olarak migration dosyasını, Eloquent modelini, controller'ı, form isteklerini, rotaları ve Blade görünümlerini oluşturabilir. RevDoğrulama kurallarını inceleyin ve sevkiyat öncesinde testleri çalıştırın.ping.

Evet. Yapay zeka, kullanım dışı bırakılmış yöntemleri, değişen yapılandırmaları ve ad alanlarını ve güncellenmiş paket gereksinimlerini belirleyebilir ve ardından sürüm sürüm yükseltme işlemini yönlendirebilir. Geçiş büyük olduğundan, yükseltmeyi kademeli olarak yapın ve her adımdan sonra test edin.

Bu yazıyı şu şekilde özetleyin: