59
Laravel 5.3 The PHP Framework For Web Artisans

Yeni başlayanlar için Laravel

Embed Size (px)

Citation preview

Laravel 5.3The PHP Framework For Web Artisans

Laravel Life Cycle

ROUTES: Gelen istekleri karşılar ve controller’a gönderir.MODELS : Veritabanını sorgular ve gerekli verileri döndürür.VIEWS : Template Engine ile render edilmiş görünüm sayfalarıdır.CONTROLLERS : Kullanıcı isteklerini idare eder, modellerden veri alır ve görünümlere iletir.

Laravel Root / App

Öncelikle /app dizinine bir göz atalım.

Uygulamamızın ana dizini /app klasörüdür.

Uygulama geliştirirken, neredeyse vaktimizin tamamını bu klasör altında geçireceğiz.

ConsoleTüm artisan komutlarını içerir.

HttpTüm denetçilerinizi (Controllers), ara katmanlarınızı (Middlewares), gelen isteklerinizi (Requests) ve rotalarınızı içerir.

Providers :Tüm uygulama servis sağlayıcılarını içerir. Laravel’in çekirdek hizmetlerinin tamamı servis sağlayıcılar tarafından önyüklenebilir.

Laravel Root / App

EventsTüm etkinlik sınıflarını içerir.

ListenersEtkinlik sınıflarını dinleyen listener sınıflarını içerir.

ExceptionsUygulamaki özel durum hatalarını yakalayan sınıfları içerir.

JobsUygulamanız tarafından sıraya alınan tüm işleri içerir.

PoliciesUygulamanız için yetkilendirme sınıflarını içerir. Bir kullanıcının bir işlemi gerçekleştirebileceklerini belirlemek için kullanılır.

Not: Klasör içerisindeki user.php bir model dosyasıdır.Laravel dizin yapısında model klasörü bulunmamaktadır. Model sınıfları /app dizininin altında oluşturulmaktadır.

Laravel Root / Other

bootstapUygulamanın autoloading ve önbellek dosyalarını içerir.

configUygulamanın ayar dosyalarını içerir.

Laravel Root / Other

databaseVeritabanı Seeder ve Migration dosyalarını içerir.

Örnek Migration

Laravel Root / Other

publicResimler, CSS, Javascript dosyalarını içerir.

resourcesGörünüm (views) ve dil dosyalarını içerir.

Laravel Root / Other

StorageTüm compile edilmiş blade şablonlarını, cache dosyalarını ve log kayıtlarını içerir.

testsTest sınıflarını içerir.

vendorUygulamadaki paket bağımlılıklarını içerir.

Application Example

Örnek bir veri listeleme işlemi yapalım.

Uygulamayı ilk kez indiriyorsanız aşağıdaki adımları takip ediniz.

1. git clone https://github.com/laravel/laravel.git2. cd laravel3. cp .env.example .env4. composer install5. php artisan key:generate

Application Example

Uygulamayı host ediyoruz.

• php artisan serve

Application Example

Uygulama host edildi. Artık örnek uygulamaya başlayabiliriz.

Application Example

Terminal’I açıp uygulama dizinine geliyoruz. Artisan komutuyla yeni bir controller oluşturuyoruz.

php artisan make:controller ExampleController

IDE ile projemizi açıp /app/Http/Controllerdizininde ExampleController.php dosyasını göreceksiniz.

Hemen düzenlemeye başlıyoruz.

Sınıf içerisine index adından yeni bir fonksiyon tanımlayalım.

Application Example

Peki bunun çıktısını nasıl göreceğiz ?

Bunun için hemen /routes/web.php dosyasını açıp rotamızı ilgili sınıfın fonksiyonunabağlıyoruz.

Gelen URL parametresi ile sınıf içerisindeki fonksiyonu bağlıyoruz.

Application Example

Browser’a gelip hemen kontrol edelim.

Gördüğünüz gibi rotamızı ExampleController’ın index fonksiyonuna başarıylaBağlamış olduk.

Application Example

Route’da aşağıdaki gibi bir fonksiyonda kullanılabilir ama bu tavsiye edilen bir yöntem değildir.

GET yöntemiyle bir istek yapmış olduk. Mevcut yönlendirici yöntemlerini de sıralayalım.

Application ExampleBazen birden çok HTTP fiiline yanıt veren bir yönlendirme kayıt etmeniz gerekebilir.Bunu match yöntemi kullanarak yapabilirsiniz.

Route Parametreleri

URL içerisindeki ID’yi yakalamak için yönlendirme parametreleri tanımlayabilirsiniz.

Application Example

Örneklere devam ediyoruz. DuyuruController içerisinde liste oluşturup bunu view dosyasına göndereceğiz.

• Rotamızı belirleyelim.

Route::get('/duyurular', 'DuyuruController@liste');

• Terminal üzerinden Controller’ı oluşturalım.

Php artisan make:controller DuyuruController

• resources/views/ klasörü içerisinde duyurular.blade.php adında bir dosya oluşturalım.

Application ExampleDuyuruController içerisinde aşağıdaki fonksiyonu yazalım.

Peki ne yaptık ?

$duyurular adında bir dizi oluşturduk. duyurular.blade.php adında ki view dosyasına with ile duyurular değişkenini with ile gönderdik. Laravel, Blade Template Engine’i kullanır ve compile edilebilmesi için view dosyalarının sonuna .blade eklenmelidir.

Örneğin; dosyaadi.blade.php ( View’i return ederken yanlızca dosya adı yazılır.

Dosya, view dizini içerisinde bir alt klasör içerisinde olduğunda klasoradi.dosyaadi seklinde yazıyoruz.

Application ExampleŞimdi duyurular.blade.php dosyamızı açıp gönderilen değişkeni listeleyelim.

Bu bölümde Blade’I anlamaya çalışacağız.

Blade içerisinde <?php ?> tagları kullanılabilir fakat tercih edilen bir yöntem değildir.

Döngüler

@foreach($cogul as tekil)@endforeach

Tag

<?php tagları yerine çift süslü parantez kullanılır.

{{ $var }}

Application ExampleŞimdi browser’da duyurular linkine tıklayalım.

http://localhost:8000/duyurular

Application ExampleBLADE TEMPLATE ENGINE

Blade, Laravel ile gelen pratik, ancak güçlü şablonlama motorudur. Diğer popüler PHP şablonlu motorların aksine, Blade, view dosyalarında düz PHP kodunu kullanmanızı kısıtlamaz. Aslında, tüm Blade görüntüleri düz PHP kodu halinde derlenir ve değiştirilene kadar önbelleğe alınır, yani Blade uygulamanıza sıfır yük ekler. Blade görünümü dosyaları .blade.php dosya uzantısını kullanır ve genellikle resources / views dizininde saklanır.

Layout Kullanımı

İlk olarak, bir ”master" sayfa düzenini inceleyeceğiz. Çoğu web uygulaması çeşitli genel sayfalarda aynı genel düzenini koruduğu için, bu düzeni tek bir blade görünümü olarak tanımlamak daha uygundur:

Application ExampleBLADE TEMPLATE ENGINE

Master Layout(views/layouts/master.blade.php)

Extends Master(views/blog.blade.php)

Application ExampleBLADE TEMPLATE ENGINE

Bazen bir değişkeni yazdırmak isterken değişkenin tanımlanmış olduğundan emin olamadığımız durumlarda shorthand if/else yapısını kullanırız.

Bunun yerine blade ile aşağıdaki kısayolu kullanabiliriz. Blade bunu üçlü ifade gibi derleyecektir.

Varsayılan olarak, XSS saldırılarını önlemek için Blade {{}} ifadeleri otomatik olarak PHP'nin htmlentities işleviyle gönderilir. Verilerinizin çıkmasını istemiyorsanız aşağıdaki sözdizimini kullanabilirsiniz:

Application ExampleBLADE TEMPLATE ENGINE

IF/ELSE

If ifadelerini @if, @elseif, @else ve @endif yönergelerini kullanarak oluşturabilirsiniz. Bu yönergeler PHP eşdeğerleriyle aynı işlevi görür:

Application ExampleBLADE TEMPLATE ENGINE

IF/ELSEIf ifadelerini @if, @elseif, @else ve @endif yönergelerini kullanarak oluşturabilirsiniz. Bu yönergeler PHP eşdeğerleriyle aynı işlevi görür:

UNLESSKolaylık sağlamak için, Blade ayrıca bir @unless yönergesi sağlar. (Sonuç false ise)

Application ExampleBLADE TEMPLATE ENGINE

LOOP

Koşullu ifadelere ek olarak, Blade PHP'nin döngü yapılarıyla çalışmak için basit yönergeler sağlar. Yine, bu yönergelerin her biri PHP eşdeğerleriyle aynı işlev görür:

Application ExampleBLADE TEMPLATE ENGINE

Döngüler

Döngüler kullanırken, döngüyü de sonlandırabilir veya geçerli yinelemeyi atlayabilirsiniz:

Koşulu tek bir satırda da belirtebilirsiniz.

Application ExampleBLADE TEMPLATE ENGINE

Loop Değişkeni

Döngü yaparken, döngü içinde $loop değişkeni bulunur. Bu değişken, geçerli döngü dizini ve bunun döngü aracılığıyla ilk veya son yineleme olup olmadığı gibi yararlı bazı bilgilere erişilmesini sağlar:

İç içe geçmiş bir döngüyseniz, parent özelliğinden döngünün $ loop değişkenine erişebilirsiniz:

Application ExampleBLADE TEMPLATE ENGINE

Loop Property

$ loop değişkeni ayrıca çeşitli özellikleri de içerir:

Geçerli döngü yinelemesi dizini (0'dan başlar).

Geçerli döngü yinelemesi dizini (1’den başlar).

Döngü döngede kalır.

Döngüdeki öğeleri toplar.

Döngünün ilk öğesi

Döngünün son öğesi

Geçerli döngü derinliği

Geçerli döngünün bir üst öğesi

Comment Satırı

PHP Tag

Application ExampleBLADE TEMPLATE ENGINE

Include

Blade'in @include yönergesi, Blade görünümünü başka bir görünüme dahil etmenizi sağlar. Üst görünümde kullanılabilen tüm değişkenler, birlikte gelen görünüme de aktarılacaktır.

Dahil edilen görünüm, üst görünümde mevcut tüm verileri devralacak olsa da, ek bir dizi veriyi dahil edilen görünüme de aktarabilirsiniz:

Olabileceği veya olmayabileceği bir görünümü eklemek isterseniz @includeIf yönergesini kullanmalısınız:

Blade ile ilgili daha detaylı bilgi için;https://laravel.com/docs/5.3/blade

Application ExampleŞimdi örnek uygulamamıza devam edelim. Öncelikle mysql veritabımızı uygulamaya tanıtalım. Daha sonra blog adında bir tablo oluşturup kayıt oluşturup listeleyelim.

1. Öncelikle uygulamanın rootunda yer alan .env dosyamızı açıyoruz. Mysql bilgilerimizi yazıp kaydediyoruz.

Application Example• Tablo oluşturabilmek uygulama içerisinde terminali çalıştırıp aşağıdaki komutu yazıyoruz

php artisan make:migration blogs_tablosunu_olustur --create=blogs

Bu komut ile birlikte yeni bir migration sınıfı oluşturduk. Veritabanı şemasını oluşturacağız.

Application ExampleMigrasyon sınıfı bağlı fonksiyonlarıyla birlikte oluşturuldu. Şimdi tek yapmamız gereken istediğimiz alanları eklemek!

Öncelikle döküman üzerinden veritiplerini inceleyelim.

Tüm liste için tıklayın;https://laravel.com/docs/5.3/migrations

Application Example

Alanlarımızı belirlediğimizi ve döküman üzerinden veri tiplerine göre şemaya eklediğimizi varsayıyorum. Çıktı aşağıdaki gibi olacaktır;

Eklediğimiz alanlar; title, description, content, active

Application Example

Alanları ekledikten sonra tekrar terminal’e gelip aşağıdaki komutu çalıştırıyoruz.

php artisan migrate

İşlem bu kadar basit artık veritabanımızda belirlediğimiz alanlar ve veri tipleriyle birlikte blogs tablomuz oluşturuldu.

Application Example

Blog için tablomuzu migrate ettik. Şimdi modelimizi oluşturacağız. Terminal üzerinden aşağıdaki komutu yazalım.

php artisan make:model Blog

Laravel’de genellikle model isimleri tekil, tablo isimleri ise çoğuldur.

Örneğin; Tablo adı “articles”, model adı Article şeklinde.

Şimdi /app dizinimizin altına bakalım ve model sınıfımızın oluşup / oluşmadığını kontrol edelim.

Application Example

Eğer belirttiğimiz gibi model adı tekil, tablo adı çoğul değil ise sınıf içerisinde tablo adını belirtmek zorundayız. Varsayılan olarak Laravel model adına s takısı ekleyip veritabanı içerisinde o tabloyu arar ve modele eşler.

Dikkat ettiyseniz model sınıfı Eloquent ORM ‘den extend ediliyor. Peki nedir bu Eloquent ORM ?

Laravel ile birlikte gelen Eloquent ORM, veritabanınızla çalışmak için güzel, basit bir ActiveRecord uygulaması sağlar. Her bir veritabanı tablosu, bu tabloyla etkileşimde bulunmak için kullanılan bir "Model" e sahiptir. Modeller tablolardaki verileri sorgulamanın yanı sıra tabloda yeni kayıtlar eklemenize izin verir.

Application Example

Eloquent ORM’de dilediğiniz veritabanını, sorgularınızı hiç değiştirmeden kullanabilirsiniz.

Varsayılan veritabanını ve bilgileri yapılandırmak için /config/database.php dosyasını inceleyebilirsiniz.

Application Example• Şimdi örnek uygulamıza geri dönelim ve BlogController’ı oluşturalım.

php artisan make:controller BlogController --resource

Application Example• Rotalarımızı oluşturalım. (routes/web.php)

Eğer dikkat ettiyseniz Route::get, Route::post şeklinde bir kullanım yerine Route::resource şeklinde kullandık.

Şimdi terminal’e gelelim ve aşağıdaki komutu yazalım.

php artisan route:list

Gördüğünüz gibi resource kullandığımız için yönlendirici yöntemlerini uygulama rotalara dahil etti. BlogController oluştururken de –resource ekini kullanmıştık ve bu metotların tümü sınıfımıza eklenmişti.

Application Example• Şimdi isterseniz Browser’ı açıp URI’leri test edelim.

http://localhost:8000/blog URI’sinin Action’ı;

App\Http\Controllers\BlogController@index

Fonksiyon boş olduğu için beyaz bir sayfa ile karşılaştık.

Application Example• Şimdi hemen resources/views dizini altına blade dosyalarımızı oluşturalım.

Master Page Layout’u oluşturalım.(resources/views/layouts/master.blade.php)

Application Example• Create view’i (Yeni Blog Ekleme Sayfası) oluşturalım. (resources/views/blog/create.blade.php)

Application Example• Rotayı, view’e bağlayalım. ( BlogController’da create fonksiyonu çalıştığında blog/create.blade.php’yi return eder. )

Application Example• Rotayı, view’e bağlayalım.

( BlogController’da create fonksiyonu çalıştığında blog/create.blade.php’yi return eder. )

Form submit edildiğinde store fonksiyonu çalışacak.

Bu fonksiyonun içerisine de gelen request’i return ediyoruz.

Application Example• Form’den gelen request’i JSON formatında return ettik.

Peki formdan gelen request’i veritabanına nasıl kaydedeceğiz ? Oldukça kolay!

Application Example• Formu tekrar submit ediyoruz.

Formumuz blogs tablosuna kaydedildi. Sizce de oldukça kolay olmadı mı ?

Application Example• Şimdi bloglarımızı listeleyelim. Hemen ilgili alanları düzenliyoruz.

BlogController@index fonksiyonu içerisinde;

resources/views/blog/index.php içerisinde;

Application Example• Hemen browser’a tekrar gelip http://localhost:8000/blog yazalım ve kontrol edelim.

Şimdi bu listeye bir de düzenle ikonu ekleyelim ve bu içerikleri nasıl düzenleyebiliyoruz görelim.... Font Awesome’u CDN’den çekelim.

Application Example• Listeye ikonlarımızı da ekledik.

Application Example• Rota’da belirlediğimiz gibi düzenle ikonuna tıkladığımızda BlogController@edit fonksiyonu çağırılacaktır.

Application Example• /resources/views/blog/edit.blade.php’yi düzenliyoruz.

Application Example• Form submit edildiğinde BlogController@update fonksiyonu çalışır. Burada da request’i alıp model’e kaydediyoruz.

Application Example• Güncelleme tamamlandığında listeye tekrar geri gönderiyoruz.

Şimdi bir de liste üzerinde başlığa tıklayarak blog detay sayfasını hazırlayalım.

Bunun için BlogController@show methodunu kullanacağınız. İlk önce listedeki başlıkları linklendirelim.

Application Example• blog/index.blade.php içerisinde başlıklarımıza detay sayfası için linkler verildi.

HTML link çıktısı şu şekilde olacak;

Application Example• BlogController@show fonksiyonunu düzenliyoruz;

• Birde resources/blog içerisinde show.blade.php dosyasını oluşturup düzenliyoruz. Bunu daha önce oluşturmamıştık.

Application Example• Sonucu görelim; http://localhost:8000/blog/3

Application Example• Silme için de BlogController@destroy fonksiyonunu kullanacağız. Onu da aşağıdaki şekilde düzenliyoruz.

• Destroy form üzerinden submit edilmelidir. Çünkü GET ile request kabul etmez.

<form action="{{ route('blog.destroy', ['id' => $blog->id]) }}”><input name="_method" type="hidden" value=”DELETE"></form>

Link olarak göndermek istiyorsanız GET ile yeni bir rota ve fonksiyon oluşturmalısınız.

RouteRoute::get('blog/delete/{id}', ['as' => 'blog.delete’, 'uses' => 'BlogController@delete']);

BlogControllerPublic function delete($id) {}...

Teşekkürler

Daha detaylı bilgi için Laravel Dökümantasyonunu inceleyebilirsiniz.

Cüneyd Turalcuneydtural.com

[email protected]://twitter.com/cuneydtural