Kategoriler
Teknik

Laravel’de PHPUnit Testinde ‘Class env does not exist’ Hatası

Laravel (5.8)’de test yazarken

php artisan make:test FooTest

ile testi oluşturup

$response = $this->json('POST', '/api/v1/foo/bar', ['param1' => 'value1']);
$response->assertOk()->assertJsonCounts(1, 'reports');

şeklinde talep testi yapabiliyoruz.

Fakat eğer uygulamanızda Telescope kullanıyorsanız şu hatayı almanız muhtemel:

[message] => Class env does not exist
[exception] => ReflectionException
[file] => /.../vendor/laravel/framework/src/Illuminate/Container/Container.php
[line] => 794

Bu durumda phpunit.xml dosyanıza <env name="TELESCOPE_ENABLED" value="false"/> satırını eklerseniz, Telescope’u test sırasında pasif duruma getirmiş olursunuz. Böylelikle hatayı almayacaksınız.

Kolay gelsin.

Kategoriler
Teknik

“Mikro” Ufak PHP Framework

composer require yidemir/mikro

komutuyla ilgili dizine projeyi dahil ettiğiniz taktirde fonksiyonlar otomatik olarak işlenecektir.

 Özellikler

  • Basit şifreleme/şifre çözme
  • Veritabanı fonksiyonelliği (oluştur, oku, güncelle, sil, sorgula)
  • Sayfalama (dizi sayfalama/veritabanı ilintili sayfalama)
  • Basit talep işleme (request)
  • Yanıt (response) işlemleri (html, json, yönlendirme)
  • Rotacı (rota metodları, gruplama, kaynak işleme)
  • Doğrulama (basit validasyon işlemleri, form validasyonu)
  • Görünüm (view) işleme (Basit ama kullanışlı gövde ve blok işlemleri)

 Neden ihtiyaç duyayım?

Orta çaplı ya da büyük bir projede, projeden bağımsız servis geliştirmek için idealdir.

 Nasıl kullanırım?

Evvela bir index.php sayfası oluşturalım ve yazmaya başlayalım:

require __DIR__ . '/vendor/autoload.php';

view\path(__DIR__ . '/views'); // görünüm dosyalarının bulunacağı dizin
crypt\secret('foobar'); // şifreleme kullanılacaksa belirlenmesi gereken gizli anahtar

route\get('/', function() {
    $posts = db\table('posts')->get('where comment_count=? and is_published=1', [5]);
    return response\json($posts);
});

route\get('/show/:id', function($id) {
    $post = db\table('posts')->find($id);
    return response\json($post);
});

route\post('/', function() {
    $values = request\all();
    $validator = validator\validate($values, [
        'title' => 'required|maxlen:255',
        'body' => 'required|minlen:5',
        'created_at' => 'required|time',
        'is_published' => 'nullable'
    ]);

    if ($validator->fails) {
        return response\json([
            'message' => 'Form verileri geçersiz',
            'errors' => $validator->errors,
            'status' => 422
        ], 422);
    }

    db\table('posts')->insert($validator->values);
    return response\json([
        'message' => 'Gönderi başarıyla eklendi',
        'code' => 200
    ]);
});

Veya daha karmaşık bir uygulama yazacaksanız rota gruplama ve rota kaynağı oluşturma özelliğini kullanabilirsiniz.

route\get('/', 'AppControllersHomeController@index');

route\group([
    'path' => '/admin',
    'namespace' => 'AppControllersAdmin\',
    'middleware' => ['check_admin_callback']
], function() {
    route\get('/', 'DashboardController@index');
    route\resource('/posts', 'PostController');
    route\resource('/categories', 'CategoryController');
});

Daha detaylı bilgiler için kaynak kodlarına göz atabilir ve examples dizinini inceleyebilirsiniz. Dökümantasyon için henüz hazır değil.

İyi çalışmalar

Kategoriler
Teknik

PHP’de Geriçağırım İşlevleri (Fonksiyon ve Yöntemler) (1)

Geriçağırım (callback) işlevleri (functions) aslında PHP’de bildiğimiz fonksiyonları ifade eder. PHP’nin 5.4 sürümünden itibarent bir callable türü ile kendilerini belli ederler.

PHP’de iki çeşit işlev (fonksiyon) vardır. Birincisi adı sanı belli olan işlevler, ikincisi anonim işlevler. Adı sanı belli dediğimiz işlevler, şu ana kadar bildiğimiz kullandığımız fonksiyonlardır. Bunları çağırmanın/kullanmanın birden fazla yöntemi vardır. Birazdan bunları işleyeceğiz. İkinci olan anonim işlevler ise, fonksiyonlarla hemen hemen aynı olup, fonksiyonlar gibi tanımlanmaz. Fark olarak anonim işlevler bir değişkene atanabilir. (en basit örneğiyle, bunun dışında farklı şeylere de yarar, göreceğiz).

PHP’de bir değerin çağırılabilir olup olmadığını is_callable işleviyle kontrol edebiliyoruz. İki tane örnek verelim:

function selam_ver(string $isim): string
{
    return "Selamlar sevgili $isim";
}

var_dump(is_callable('selam_ver')); // true

$selamVer = function(string $isim): string {
    return "Selamlar sevgili $isim";
};

var_dump(is_callable($selamVer)); // true
var_dump(is_callable('isset')); // true çünkü böyle bir fonksiyon zaten var, PHP'de öntanımlı
var_dump(is_callable('herhangi_fonksiyon')); // false, çünkü herhangi_fonksiyon adında bir fonksiyon tanımlamadık

Buradan doğru, bir işlevin (fonksiyonun) tanımlı olup olmadığını veya bir değişkenin işlev olup olmadığını öğrenebiliyoruz. Aynı zamanda bir sınıf içerisindeki statik bir işlevin var olup olmadığını da öğrenebiliriz:

class Selamlayici
{
    public static function selamla(string $isim): string
    {
        return "Selamlar sevgili $isim";
    }
}

var_dump(is_callable('Selamlayici::selamla')); // true

Peki sınıf dinamikse nasıl öğreneceğiz? Şöyle:

class Selamlayici
{
    public function selamla(string $isim): string
    {
        return "Selamlar sevgili $isim";
    }
}

var_dump(is_callable([new Selamlayici, 'selamla'])); // true

Dinamik bir sınıfta dize içerisindeki ilk eleman sınıfın örneğini, ikinci eleman ise yöntemi (metodu) bulundurur.

Şimdi, buraya kadar bazı şeylere tamam dedik. Neyin ne olduğunu nasıl öğreneceğimizi anladık. Peki bunları nasıl kullanacağız. İşlevleri kullanmanın en basit yolu, herkesin bildiği gibi selam_ver('Ali') kodu gibidir. Ama PHP’de işlevleri kullanıp çağırabilmek için birden fazla yöntem vardır. Hemen görelim:

selam_ver('Ali'); // "Selamlar sevgili Ali"
$selamVer('Renas'); // "Selamlar sevgili Renas"
Selamlayici::selamla('Deniz'); // "Selamlar sevgili Deniz"
$selamlayici = new Selamlayici;
$selamlayici->selamla('Nar'); // "Selamlar sevgili Nar"

Bu gördüğümüz klasik bir biçimde işlevleri çağırmamıza yarar, birçoğumuz bilir. Başka hangi yöntemler var işlevleri çağırmak için? İlk iki tanesi call_user_func ve call_user_func_array işlevidir. Bunlar tanımlı bir işlevi bir işlev aracılığı ile çağırır. Görelim:

function parametresiz_selamlama(): string
{
    return 'Selamlar sevgili Django!';
}

var_dump(call_user_func('parametresiz_selamlama')); // "Selamlar sevgili Django!"

Yukarıdaki örnekte, parametresi olmayan bir işlevi parametresiz_selamlama() kodu ile değil, farklı bir yöntemle çağırdık. Peki neden böyle bir şeye ihtiyaç duyduk? Pek çok sebebi olabilir. Bunun normal bir fonksiyon değilde, bir sınıf yöntemi olduğunu varsaydığımızda bunu bir MVC uygulaması geliştirirken kullanabilirdik.

Peki ilk başlarda tanımladığımız parametreli işlevleri nasıl çağıracağız:

// artık var_dump işlevini kullanmadan yazacağım, görsel olarak karışık görünmesin diye

call_user_func_array('selam_ver', ['Ali']); // "Selamlar sevgili Ali"
call_user_func_array($selamVer, ['Renas']); // "Selamlar sevgili Renas"
call_user_func_array('Selamlayici::selamla', ['Deniz']); // "Selamlar sevgili Deniz"
call_user_func_array([new Selamlayici, 'selamla'], ['Nar']); // "Selamlar sevgili Nar"
call_user_func_array('parametresiz_selamlama'); // "Selamlar sevgili Django!"

Yukarıda daha normal biçimde çağırdığımız işlevleri, şimdi başka (call_user_func_array) bir işlev aracılığıyla çağırdık. Anonim bir işlevi şu şekilde de çağırabiliriz:

call_user_func(function(){
    echo 'Hoş geldiniz';
});

Peki, anonim işlevleri gerçek hayatta nasıl kullanacağız? En basit haliyle şunu yazalım:

function ozel_selamlama(string $isim, callable $ozelSelamla): string
{
    return call_user_func_array($ozelSelamla, [$isim]);
    // veya $ozelSelamla($isim); bu ikisi aynı şey
}

ozel_selamla('Ali', function($isim): string {
    return "Bu farklı bir selamlama biçimi sevgili {$isim}!";
}); // "Bu farklı bir selamlama biçimi sevgili Ali!"

Yukarıdaki örnekte, özel bir selamlama mesajı vermek için iki parametreli bir işlev/fonksiyon oluşturduk. İlk parametre selamlanacak kişinin adını alıyor, ikinci parametre ise nasıl selamlanacağını ayarlayan anonim bir işlevi alıyor.

Başka bir örnek daha verelim. Bu sefer daha spesifik bir örnek verelim:

function eklemeli_selamla(string $isim, ?callable $ek = null): string
{
    $selamlama = "Selamlar sevgili $isim";

    if (!is_null($ek)) {
        return $selamlama . $ek($isim);
        // veya:
        // return $selamlama . call_user_func_array($ek, [$isim]);
    }

    return $selamlama;
}

eklemeli_selamlama('Deniz'); // "Selamlar sevgili Deniz"
eklemeli_selamlama('Deniz', function($isim): string {
    return ". Adının $isim olduğunu biliyorum!";
}); // "Selamlar sevgili Deniz. Adının Deniz olduğunu biliyorum!"

Şimdilik bahsedeceklerimiz bunlar. Bu yazının bir devamı daha olacak. Devamı niteliğindeki yazıda ise Closure sınıfı, sınıfların bir işlev olarak çağırılabilmesi ve Reflection sınıfından bahsetmeyi planlıyorum.

İyi çalışmalar.

Kategoriler
Teknik

Tarayıcının ES6’yı Destekleyip Desteklemediğini Kontrol Etmek

Aşağıdaki kod try-catch bloğu ile kullanıcının tarayıcısının ES6 desteğini bize verebilir.

var supportsES6 = function() {
  try {
    new Function("(a = 0) => a")
    return true
  }
  catch (err) {
    return false
  }
}()

Bu kod, kullanıcı tarayıcısının ES6 desteğini tamamıyle ve her özelliğiyle doğrulamasa da genel hatlarıyla bize bilgi verebilir.

if (!supportsES6) {
  alert('Tarayıcınız ES6'yı desteklemiyor')
  window.location.href('/browser-not-supperted')
}

Şu yöntemi kullanarak ES6 kodları içeren JavaScript dosyamızı sayfanın gövdesine dahil edebiliriz.

if (supportsES6) {
  var script = document.createElement("script")
  script.src = "es6-iceren-js-dosyasi.js"
  document.head.appendChild(script)
}
Kategoriler
Teknik

PHP ile Kelime/Metin/Dizge İşlemleri

PHP ile kelime işlemleri yapabilmek için birçok fonksiyon bulunmaktadır. Bunları hepsine, PHP’nin resmi sitesinden Dizge İşlevleri başlığından göz atabilirsiniz. Ben burada size, çok sık kullanılan ve ihtiyaç duyulan kelime/dizge fonksiyonlarından bahsedeceğim.

PHP ile Kelime Değiştirme İşlemleri

PHP ile bir metindeki herhangi bir kelime veya kelimeleri değiştirmek için str_replace fonksiyonu kullanılmaktadır. PHP’de kelime işlemleri oldukça kolay ve basittir.

$cumle = 'Merhaba sevgili kardeşim, nasılsın?';
$eski = 'kardeşim';
$yeni = 'dostum';

$yeniCumle = str_replace($eski, $yeni, $cumle);
// sonuç: Merhabs sevgili dostum, nasılsın?

PHP ile Birden Fazla Kelime/Metin Değiştirmek

Aynı fonksiyon ile birden fazla kelime değiştirme yapılabiliyor. Şöyle ki:

$cumle = 'Bugün Pazartesi ve yarın ilk iş kod yazmak olacak.';
$eski = ['Bugün', 'yarın'];
$yeni = ['Yarın', 'şimdi'];

$yeniCumle = str_replace($eski, $yeni, $cumle);
// sonuç: Yarın Pazartesi ve şimdi ilk iş kod yazmak olacak.

Eğer bir sözlük gibi, bütün kelimeleri değiştirmek istiyorsak strtr fonksiyonu da işimizi fazlasıyla çözecektir. Şöyle ki:

$cumle = 'Selamlar, nasılsınız? Orada havalar nasıl? Umarım iyidir. Sevgiler.';
$eskiYeni = [
    'Selamlar' => 'Merhaba',
    'havalar' => 'durumlar',
    'iyidir' => 'her şey yolundadır',
    'Sevgiler' => 'Saygılar'
];

$yeniCumle = strtr($cumle, $eskiYeni);
// sonuç: Merhaba, nasılsınız? Orada durumlar nasıl? Umarım her şey yolundadır. Saygılar.

PHP ile Kelime Bölme/Parçalama ve Birleştirme İşlemleri

PHP’de kelime işlemleri arasında en çok ihtiyaç duyulanlardan bir tanesi de kelime/metin bölme (parçalama) işlemleridir. Hemen PHP’de nasıl kelimeleri veya kelime öbeklerini parçalayıp bölebiliriz görelim:

Örneğin virgülle sıralanan bir metini, virgülleri kullanarak birbirinden ayıralım. Bunun için PHP’de explode fonksiyonunu kullanmamız gerekiyor:

$etiketler = 'PHP Dersleri, Metin İşlemleri, Kelime Bölme';
$etiketArray = explode(',', $etiketler);
// sonuç: ['PHP Dersleri', ' Metin İşlemleri', ' Kelime Bölme'];
// yani 3 öğeli bir dizemiz oldu. Fark ettiyseniz bazılarının başında boşluk var. Bunları süzelim:

// array_map fonksiyonu bir dizeyi düzenlememize, süzmemize yarar (ek bilgi)
$etiketArray = array_map(function($kelime){
    // trim fonksiyonu dizgenin sağındaki ve solundaki boşlukları siler
    return trim($kelime);
}, $etiketArray);

İkinci Örnek: Kelimeleri Bölüp/Parçalayıp Tekrar Birleştirmek

İkinci örneğimizde ise, kelimeleri bölüp, farklı şekilde tekrar parçalarını birleştireceğiz. Elimizde yine virgülle ayrılmış bir liste olsun ve bunları daha sonra <br> etiketi ile birleştirelim.

$isimler = 'Yılmaz, İlker, Deniz, Ali, Nar';
$isimlerArray = explode(',', $isimler);

// sonuç: ['Yılmaz', ' İlker', ' Deniz', ' Ali', ' Nar']
// Şimdi bu dizeyi alt alta HTML ile listeleyelim

$yeniIsimler = implode('<br>', $isimlerArray);
echo yeniIsimler;

// sonuç: Yılmaz<br> İlker<br> Deniz<br> Ali<br> Nar

substr fonksiyonu ile bölme/kesme

PHP’de substr fonksiyonu, elimizdeki dizgenin bir kısmını elde etmemize yarar. Yani bir aralık belirleyip, dizgenin o aralıklardaki kısmını elde edebiliyoruz. Bu fonksiyonunun en çok kullanıldığı yer, yazı kısaltma, metin kesme işlemleri oluyor. Örneğin bir blog yazısına "devamını okumak için tıklayın" seçeneği ekleyecekseniz, evvela substr fonksiyonu ile birkaç işlem yapmalıasınız.

UTF-8 destekli olması ve türkçe karakterlerde sıkıntı çıkarmaması açısından mb_substr fonksiyonunu kullanacağız/kullanınız.

Örneklerden ilerleyelim:

$yazi =  'Lorem lipsum dolor sit amet';
$ilk3 =  mb_substr($yazi,  0,  3);  // Lor
$son3 =  mb_substr($yazi,  -3);  // met
$ilk3haric =  mb_substr($yazi,  3);  // em lipsum dolor sit amet
$son3haric =  mb_substr($yazi,  0,  -3);  // Lorem lipsum dolor sit a

Peki gerçek hayatta bunu nasıl kullanabiliriz. Bir blog gönderisinin çok uzun olduğunu ve bunu kesmemiz gerektiğini düşünelim. Şöyle bir yol izlemeliyiz:

$yazi = 'Lorem lipsum dolor sit amet';
$yazi = substr($yazi, 0, 5);
$yazi .= '...';
$yazi .= ' <a href="#">Devamını okumak için tıklayın</a>';
echo $yazi; // Lorem... <a href="#">Devamını okumak için tıklayın</a>

PHP ile Kelime Arama

Bu örneğimizde, PHP ile metin içerisinde kelime veya öbek aramayı işleyeceğiz. Bunun için kullanacağımız strpos ve mb_strpos fonksiyonları olacak. Bu fonksiyonlar bir metin içerisinde bulunan kelimenin indisini (sayısal konumu) döndürür.

Peki neden iki fonksiyon ve bunlar arasındaki fark ne? Birincisi yani strpos fonksiyonu türkçe karakter desteklemez. Yani Türkçe karakterli bir kelimeyi aramak istediğinizde işinize yaramayacaktır ve doğru sonucu vermeyecektir. Bunun yerine UTF-8 destekli olan mb_strpos fonksiyonunu kullanmanız gerekmektedir. Biz örneklerimizde bu fonksiyonu kullanıyor olacağız.

$dizge = 'Merhaba dünya! Bugün hava güzel olacak.';
$nerede = mb_strpos($dizge, 'olacak.');

if ($nerede !== false) {
    echo "Kelime {$nerede}. indiste var!"; 
} else {
    echo "Kelime bulunamadı, taze bitmiş!";
}

// çıktı "Kelime 32. indiste var!" olacak

mb_strpos fonksiyonu, eğer aranılan kelime dizge içerisinde varsa konumunu döndürür yani integer tipinde bir sayı döndürür. Eğer yoksa, false döndürür. Bir kelimenin bir cümle içerisinde olup olmadığını sorgulamak için şunu kullanabiliriz:

if (mb_strpos('Merhaba dünya', 'evren') === false) {
    echo "Kelime yok kardeşim!";
} else {
    echo "Kelime bir yerlerde mevcut";
}

// çıktı "Kelime yok kardeşim!" olacak

Kelimeyi bulup değiştirmek içinse ilk başlıkta anlattığımız str_replace fonksiyonunu kullanabilirsiniz.


Şimdilik en çok kullanılanlardan bazılarına burada yer verdim. Bunun dışında PHP ile kelime sayma, kelime silme ve kelime yineleme gibi birçok işlev mevcut. Talep olursa bunlar hakkında da detaylı bir yazı yazabilirim. Umarım işinize yarar.

Kolay gelsin.