Latest Posts

Laravel’de projede tanımlı ENV değerlerine erişme

Projelerimizde çoğu zaman çeşitli config tanımlamaları yapmamız gerekiyor. En basitinden, local development ortamımızda veritabanı ayarlarımız farklı iken, sunucuda farklı olabilir. Bu farklılıkları tanımlamak için farklı farklı yöntemler vardır. Her bir ortam için özel dosya oluşturmak, bilgisayarın ENV değelerini kullanmak, herkesi aynı değişken değerlerini kullanmaya zorlamak 🙂 gibi. Laravel, proje özelindeki değişkenlerin tanımı için vlucas/phpdotenv paketini kullanmaktadır. Symfony Framework’de 3.4 versiyonu ile birlikte .env kullanımına başladı. Biz .env yaklaşamını oldukça beğeniyoruz açıkçası.

.env dosyasında tanımlı değerlerin proje içerisinde kullanımına dair sıkça yapılan bir hata var. Bu yazımızda özellikle bunu paylaşmak istedik. vlucas/phpdotenv paketi sayesinde, .env dosyasında tanımlı bir değere env(‘CONFIG_KEY’) şeklinde ulaşabilirsiniz. Oldukça pratik. Hem sunucu bazlı değişkenleri kontrol ediyor, hem de .env dosyanıza bakıyor ve ona göre bir değer döndürüyor. Fakat Laravel’de, eğer production ortamında config dosyanızı cacheliyorsanız (php artisan config:cache) -ki şiddetle tavsiye ederiz-, artık .env dosyanızda tanımlı değişkenlere `env(‘’), methodu ile erişemezsiniz.

Bunun için yapmanız gereken tek şey, env değerlerinizi config dosyalarında tanımlamak ve config() üzerinden kullanmak. Diyelim ki .env dosyanızda bir config değeriniz var.

ANALYTICS_ID=degisken

Bu değeri, config dosyası üzerinde kullanabilirsiniz. Bunun için istediğiniz config dosyasını kullanabileceğiniz gibi, yeni bir dosya da ekleyebilirsiniz. Örneğin, config/site.php diye bir dosya ekleyelim.


<?php //config/site.php return [ ‘analytics_id’ => env(‘ANALYTICS_ID’), ];

şeklinde dosyayı tanımladığınızda, bu değere config(‘site.analytics_id’) şeklinde erişebilirsiniz. Bu sayede, config cache’i yaptığınızda da env değelerinize erişebilirsiniz.

Laravel için docker ortamı: Vessel

Çoğu geliştirici, Laravel için oluşturulmuş “Homestead” vagrant kutusunu tercih etmekte. Ancak vagrant’ı tercih eden kişi sayısında ciddi bir düşüş yaşanıyor. Vagrant ilk çıktığı yıllarda oldukça pratik ve neredeyse alternatifsiz iken, artık çok çeşitli ve pratik geliştirme ortamları mevcut. Docker, bunların başında geliyor. Adını sıkça duyduğunu fakat bir türlü başlayamadığınız ya da denemelerinizin yarım kaldığını tahmin edebiliyoruz.

Tıpkı Homestead ya da Valet gibi, Vessel’de oldukça pratik bir biçimde Docker ile Laravel çalışma ortamınızı hazırlıyor. Detaylar şurada: https://vessel.shippingdocker.com/

Eğer daha önce Docker kullanmadıysanız, Docker ortamına giriş yapmanız için bu paket tam size göre olabilir. Kurulumu ve kullanımı oldukça basit. Detaylar için Vessel’in sayfasına göz gezdirmeyi unutmayın.

Laravel’i PHPStorm ile etkin kullanmak.

Özellikle büyük frameworklerle çalışırken, IDE (integrated development environment)’ler bizler için çok büyük yardımcı oluyorlar. Şüphesiz PHPStorm, en iyi IDE’ler arasında aday gösterilebilecek nitelikte. Tek kusuru paralı olması diyebiliriz ki bu parayı da hakediyorlar 🙂

Ancak IDE’ler tüm frameworklere %100 uyumlu olmayabiliyorlar. Bu noktada da ide eklentileri yardımımıza koşuyor. Laravel için kullandığımız iki eklenti var. Birisi IDE seviyesindeyken birisi de framework seviyesinde.

1- PHPStorm Laravel Eklentisi

https://plugins.jetbrains.com/plugin/7532-laravel-plugin

Bu eklenti Laravel ile PHPStorm arasındaki uyum sorunlarını ortadan kaldırıyor. Bununla birlikte, bir çok kolaylık getiriyor. Örneğin route isimlerini bu eklenti sayesinde otomatik tamamlayabiliyorsunuz. Ya da config key’lerini otomatik tamamlayabiliyorsunuz. Ve bunun gibi bir sürü özellik! Eğer Laravel ile kodlama yapıyorsanız, bu eklentiyi mutlaka kullanmalısınız. Mutlu Laravel kodlamalar 🙂

2- Laravel Ide-Helper paketi

https://github.com/barryvdh/laravel-ide-helper

Eloquent, active record kullanan bir ORM. Bu yüzden, model dosyalarınız içerisinde tek tek veritabanı kolonlarını tanımlamanıza gerek yok, bildiğiniz gibi. $model-&gt;column şeklinde kullandığınızda, Eloquent sizin için veritabanındaki column değerini döndürecek ya da hata verecektir veriye erişemediği için. Bu kolon tanımları model dosyanızda olmadığı için doğal olarak IDEniz otomatik tamamlama yapamaz. Ama ide-helper paketi sayesinde, Ide’niz veritabanı şemanızı tanır hale gelir.

Bunun yanında ide-helper paketi, Laravel eklentisinin yapamadığı/bilemediği şeyleri PHPStorm’a öğreten sağlayan bir dosya üretir. Örneğin kendi insiyatifinizle yüklediğiniz bir paketi Laravel PHPstorm eklentisi bilemezken, ide-helper paketinin ürettiği dosya sayesinde öğrenebilir.

Laravel’de veritabanına JSON kaydetme ve array olarak erişmenin kolay yolu

Zaman zaman veritabanına Json kaydetmemiz gerekebilir. Bu gibi durumlarda veritabanına kaydetmeden önce verimizi json_encode ile json’a çevirip; erişirken de json_decode ile tekrar arraye çevirmemiz gerekiyor. Fakat Laravel’de bunun için kısa bir yöntem var.

Dökümanda “Array & Json Casting” (https://laravel.com/docs/5.5/eloquent-mutators#array-and-json-casting) bölümünde de belirtildiği gibi, Model dosyanıza yoksa protected $casts değişkeni ekleyerek, veri alanınızın json olduğunu belirtmeniz yeterli.


<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'options' => 'array', ]; }

Kullanımı ise oldukça pratik ve json_encode json_decode methodlarına ihtiyaç duyulmuyor.

 


$user->options = [‘a’ => ‘b’]; $user->save();   echo $user->options[‘a’]; //b

Yukarıda gördüğünüz gibi, veriyi kaydederken array olarak kaydediyorsunuz. Erişirken de array olarak erişiyorsunuz. Aradaki işlemleri Eloquent sizin için tamamlıyor.

Laravel’de hata takibini daha kolay yapabilmenizi sağlayan kütüphaneler

Hata takibi yapmak, exception’ları yakalamak ve hızlıca müdahale edebilmek uygulamalarımız için kritik önem taşıyor. Her ne kadar yazdığımız unit-functional testlerle hata oranını düşürmeye çalışsak ta, öngöremediğimiz hatalar her zaman ortaya çıkabiliyor. İşte bu durumlarda çeşitli araçlar yardımı ile hata oluştuğu anda tespit edip, detaylarını öğrenip, müdahale ediyoruz.

Laravel Logs Viewer

https://github.com/rap2hpoutre/laravel-log-viewer adresinde ikamet eden kütüphanemiz ile sistemimizdeki log kayıtlarını web üzerinden görebiliyoruz. Her bir log kaydını satır satır sunuyor ve kayıtlar arasında arama imkanı veriyor. Aslında tam bir hata takibi aracı değil, ama yine de bazı durumlarda kullanılabiliyor. Burada bulunabileceğini düşündük.

Ancak logların dışarıya açık olması, bir şekilde erişilebilir olması oldukça tehlikeli bir durum. Logları okuduğunuz sayfa öncesi bir yetkilendirme ekleyebilirsiniz. Yine de en güvenlisi terminal ile sunucunuza erişip logları okumanız ve kontrol etmeniz.

Bugsnag

 

Bugsnag (http://bugsnag.com/), sistemde oluşan hataları anlık olarak yakalar ve size bildirim ile ulaştırır. Bugsnag, standart bir logun yanında çok daha detaylı bilgiler verir. Örneğin kullanıcının tarayıcı bilgilerine, cookie bilgilerine, hangi kullanıcının login olduğuna vs gibi bir çok bilgiye ulaşabilirsiniz. Sistemde bir hata oluştuğunda, gerçekten çok detaylı bilgi sunuyor. Ancak bugsnag’in bir kusuru var ki o da paralı olması.

Busnag Laravel paketine şu linkten ulaşabilirsiniz: https://github.com/bugsnag/bugsnag-laravel

Sentry

Sentry.io

Sentry (http://sentry.io/), tıpkı Bugsnag gibi, sitenizde bir hata olduğunda anında yakalayan ve size çeşitli kanallardan (Slack, mail, sms, vd.) bildirim gönderen bir sistem. Sentry hakkında çok fazla detay vermeye gerek yok çünkü Bugsnag ne yapabiliyorsa, aynısını Sentry’de yapabiliyor. Bunun yanında, Sentry belli bir kullanıma kadar ücretsiz. Aylık 10.000 hata yakalama. Ortalama bir proje için oldukça yeterli bir rakam. Zaten hatayı yakaladıkça siz fixleyeceğiniz için, aylık alınan hata sayısı gittikçe düşecektir 🙂

Sentry Laravel paketine şu linkten ulaşabilirsiniz: https://github.com/getsentry/sentry-laravel

Eğer uygulamanız çok fazla hata üretiyorsa, belki de danışmanlık hizmetlerimizden faydalanmanın vakti gelmiştir 🙂

Laravel “wasRecentlyCreated” özelliği ile modelin yeni oluşturulup oluşturulmadığını öğrenin

Laravel wasRecentlyCreated kullanımı

Laravel’de veritabanından bir kaydı firstOrCreate methodu ile çekiyorsanız, ve eğer kayıt veritabanında yoksa yeni kayıt oluşturuyorsanız; firstOrCreate methodu ile dönen sonucun yeni mi oluşturulduğunu yoksa zaten veritabanında olduğunu tespit etmenizi yaratan özelliğimiz (property) wasRecentlyCreated.

Ekran görüntüsünde de görebileceğiniz gibi, kullanıcının yeni oluşup oluşmadığını bu özellik ile kontrol edebiliyorsunuz.

Sadece firstOrCreate ile değil, diğer yöntemlerle oluşturduğunuz kayıtlarda da bu özelliği kullanabilirsiniz.

Bu özellik, sadece geçerli yaşam döngüsünde kullanılabilir. Yani yeni oluşturulup oluşturulmadığını anlamak için tarih kontrolü vs yapılmaz. Bir kayıt oluşturulduğunda; objeye, ek olarak yeni oluşturulduğuna dair bir ekleme yapılır.

Umarız Eloquent’in bu çok bilinmeyen özelliği bir noktada işinizi kolaylaştırır 🙂

Composer’da spesifik PHP versiyonu ayarlaması

Php 7.0, 7.1, 7.2 çok güzel özelliklerle geldi. Hoşgeldiler. Fakat kimi zaman sunucu ile local çalışma ortamımız arasında versiyon farklılıkları olabilir. Örneğin local çalışma ortamımızda Php 7.0 yüklü ve sunucuda Php 7.1 / 7.2 yüklü ise; büyük oranda (deprecated özellik kullanılmadıysa) bir problem yaşamadan çalışacaktır.

Ama eğer local çalışma ortamınızda Php 7.2 yüklü ve sunucunuzda 7.1/7.0 yüklü ise problemle karşılaşmanız olası. Örneğin, 7.2 sürümünde yeni eklenmiş özelliklerden birini localde geliştirme yaparken kullanıyorsanız, sunucuya gönderdiğinizde 7.2 den daha düşük bir versiyon olduğu için bu yeni özellik hata verecektir. Bundan kaçınmak çok zor değil. Hem IDE’ler bu konuda destek veriyor hem de aşağı yukarı yeni eklenen tüm özellikler bilindiğinden kullanmaktan kaçınılabiliyor. Tabi bunun en iyi yolu, test yazıp hangi versiyonlarda kullanacaksanız onlar için test çalıştırmak. Böylece uygulamanızın kullanmak istediğiniz php versiyonlarında hata verip vermeyeceğini görebilirsiniz.

Bir diğer problem ise, composer ile gelen bağımlılıklarda yaşanabilir. Composer’da aslında çok güzel bir özellik var. Örneğin, bir paketi dahil ettiğinizde; o paketin 7.0 için farklı, 7.2 için farklı sürümü yüklenebiliyor. Genelde sizin yüklediğiniz paketlerde bunlar yaşanmıyor ama o paketlerin alt bağımlılıkları için bu tarz tanımlamalar yapılmış olabiliyor. Bu da şuna yol açıyor:

X paketinin bağımlılıkları, sizin sisteminize PHP 7.2 ye göre yükleniyor.
Fakat sunucuda PHP 7.0 yüklü olduğu için bu bağımlılıklar sunucunuza yüklenemiyor.

Bundan kaçınmak için çok güzel bir ayar var. composer.json dosyamıza eklememiz gereken satır şu şekilde:

"config": {
"platform": {
"php": "7.0"
}
}

Gördüğünüz gibi, uygulamamızın PHP7.0 a göre çalışacağını belirtiyoruz ve composer ona göre davranıyor. Sizin sisteminizde Php7.2 yüklü olsa ile, tüm bağımlılıklar 7.0 mış gibi yüklenecek. Config için diğer ayarlardan da ileride bahsedeceğiz.

Laravel 5.5 ile eklenen yeni Route methodları

laravel routerLaravel 5.5 ile gelen yeniliklerden bir diğer ise, Router’a eklenen yeni methodlar oldu. Yeni gelen 2 method ile doğrudan router tanımlarınızın olduğu dosyada bir view görüntülemesini sağlayabilirsiniz ya da hızlıca 301, 302, 307 redirect işlemi gerçekleştirebilirsiniz. Bu eklenen methodlar sayesinde çok basit bu 2 işlem için yeni controller oluşturmamız gerekmeyecek.

Laravel ile Cloudflare ücretsiz SSL hizmeti

Cloudflare Logo

Laravel LogoCloudflare, sunucularınız için ücretsiz bir reverse-proxy hizmetidir. Ancak ücretsiz hesap kullanırken, cloudflare’in verdiği SSL hizmeti, Laravel gibi çoğu birçok yapıda sonsuz yönlendirme hatasına neden olmaktadır. Eğer Cloudflare’in ücretli hesabı kullanılırsa bu sorun ortadan kalkar. Bunun haricinde bu sorunu programlama yoluyla çözebilirsiniz. Anahtar kelimemiz: Laravel TrustedProxy