PHP ile Hook (Kanca) Plugin Sistemi

Merhaba arkadaşlar, bu yazıda sizlere PHP’de kullanabileceğimiz kanca sisteminin mantığını anlatmak istiyorum.

Öncelikle eğer wordpress ile çalıştıysanız, eklenti yazarken wordpress’in bir çok kısmına müdahale ettiğinizi görmüşsünüzdür. Örneğin yeni bir plugin yazdığınızda admin panelinde sol menüye plugin linkinizi ekletebilirsiniz, ya da title’lara müdahale edebilirsiniz plugin’de vs. Yani wordpress’in sistemde belirlediği kısımlara, siz bu kanca sistemini kullanarak ilgili fonksiyonlarınızı çalıştırabiliyorsunuz.

PHP’de bu sistem doğrudan bulunmuyor, ancak PHP’nin özelliklerini kullanarak bunu yapmak mümkün. Bu sistemi sınıf ya da fonksiyon olarak tanımlamak mümkün. Şimdi sizlere video’da yazdığım fonksiyonların kodlarını veriyorum;

<?php

function hook($name, $callback = null, $value = null, $priority = 10){
    static $events = [];
    if ($callback !== null){
        if ($callback){
            $events[$name][$callback] = $priority;
        } else {
            unset($events[$name]);
        }
    } elseif (isset($events[$name])){
        arsort($events[$name]);
        foreach ($events[$name] as $callback => $priority){
            $value = call_user_func($callback, $value);
        }
        return $value;
    }
    return $value;
}

function add_action($name, $callback, $priority = 10){
    return hook($name, $callback, null, $priority);
}

function do_action($name, $value = null){
    return hook($name, null, $value);
}

function remove_action($name){
    hook($name, false);
}

Ve artık bu sistemi kullanarak aşağıdaki gibi örnekler yapabilirsiniz.

<?php

// a plugin
add_action('title', 'yeni_baslik');
function yeni_baslik(){
    return 'tayfun erbilen bu dersi çekti.';
}

// b plugin
add_action('title', 'yeni_baslik2');
function yeni_baslik2($text){
    return $text . ' Ve youtube kanalında yayınladı!';
}

// c plugin
add_action('menu', 'c_plugin_menu', 12);
function c_plugin_menu($menu){
    $menu[] = [
        'title' => 'C Plugin',
        'url' => 'c-plugin.php'
    ];
    return $menu;
}

// d plugin
add_action('menu', 'd_plugin_menu', 11);
function d_plugin_menu($menu){
    $menu[] = [
        'title' => 'D Plugin',
        'url' => 'd-plugin.php'
    ];
    return $menu;
}

echo do_action('title');

print_r(do_action('menu', []));

Daha iyi anlamak için videoyu izlemeyi unutmayın

Ve eğer hala satın almadıysanız, Udemy için hazırladığım PHP Eğitim Setime aşağıdaki linkten ulaşabilirsiniz <3
https://www.udemy.com/php-egitim-seti/?couponCode=PHPWEB

PHP ile Excel Dosyalarını Okumak

Şu yazımda php ile nasıl excel dosyası oluşturulacağını göstermiştim. Bu yazımda ise, daha elzem bir konuya değineceğiz. Geçenlerde bir excel dosyasının içinden verileri almam gerekti, araştırırken baktım ki çok kalabalık kodlar var, benim amacım alt tarafı satır satır okuyup verileri almak o kadar. Sonra bir repo’ya denk geldim, Sergey Shuchkin abimiz bir sınıf yazmış bu işlemler için. Basit, kullanışlı, amaca hitap ediyor.

Öncelikle dosyaları şuradan temin edin;
https://github.com/shuchkin/simplexlsx (not: adama star atmayı unutmayın :D)

Kullanımı ise çok basit;

if ( $xlsx = SimpleXLSX::parse('test.xlsx') ) {
    print_r( $xlsx->rows() );
} else {
    echo SimpleXLSX::parse_error();
}

excel’deki satırları dizi halinde size verecek, seçip istediğinizi kullanabilirsiniz.

Kolay gelsin.

PHP’de Transaction Kullanımı

En çok bankacılık sistemlerinde kullanılan bir olay bu. Örneğin bir hesaptan diğerine para aktarımında aslında 2 sorgumuz var. Önce mevcut hesaptan bakiye düşüyoruz, daha sonra diğer hesabın bakiyesine ekliyoruz. Ancak ya mevcut hesaptan bakiyeyi düştükten sonra diğer hesaba bakiye eklerken anlık bir sorun olursa ne olur? O zaman mevcut hesaptan para çıkar ama diğer hesaba para gelmez, işler karışır.

İşte bunu önlemek için sorguları transaction ile yaparsak, yani bir işlem bloğu içerisinde yaparsak sorun kalmayacaktır.

Transaction’ı PDO’da başlatmak için beginTransaction() metodu kullanılır;

$db->beginTransaction();

Daha sonra 2 sorguyu çalıştırırız;

$sorgu1 = $db->prepare('UPDATE accounts SET balance = balance - :amount WHERE account_id = :id');
$sonuc1 = $sorgu1->execute([
   'amount' => 250,
   'id' => 1
]);

$sorgu2 = $db->prepare('UPDATE accounts SET balance = balance + :amount WHERE account_id = :id');
$sonuc2 = $sorgu1->execute([
   'amount' => 250,
   'id' => 2
]);

Şimdi transaction içerisinde bu işlemleri yaptığımızda, eğer her 2 sorguda başarı ile sonuçlandıysa, o zaman commit() metodunu kullanarak işlemi tamamlayacağız. Eğer bir sorun olur ise rollBack() metodu ile yaptığımız işlemleri geri alabileceğiz.

if ($sonuc1 && $sonuc2){
   $db->commit(); // işlemi tamamla
} else {
   $db->rollBack(); // işlemi geri al
}

Siz transaction içindeki sorgularınız commit etmediğiniz sürece, sadece mevcut bağlantınızda veritabanı değişikliğini görürsünüz. Örneğin commite etmeden önce veritabanınızı kontrol ettiğinizde, sorguları çalıştırmış olmanıza rağmen değişikliği göremeyeceksiniz. Ne zaman ki commit metodunu çalıştırıp işlemi tamamlarsınız, o zaman bütün bağlantılarda bu işlem geçerli olacaktır.

Böylece olası durumlarda, kayıpları önlemek için harika bir yolu keşfetmiş oluyoruz.

Not: Eğer bu işlemi PDO’nun metodları ile değilde, mysql ile yapmak isterseniz. O zaman bir şeye dikkat çekmem gerek. Aynı işlemi PDO’nun transaction metodlarını kullanmadan yapalım.

$db->query('BEGIN TRANSACTION');

$sorgu1 = $db->prepare('UPDATE accounts SET balance = balance - :amount WHERE account_id = :id');
$sonuc1 = $sorgu1->execute([
   'amount' => 250,
   'id' => 1
]);

$sorgu2 = $db->prepare('UPDATE accounts SET balance = balance + :amount WHERE account_id = :id');
$sonuc2 = $sorgu1->execute([
   'amount' => 250,
   'id' => 2
]);

if ($sonuc1 && $sonuc2){
   $db->query('COMMIT'); // işlemi tamamla
} else {
   $db->query('ROLLBACK'); // işlemi geri al
}

Burada 2 işlemden birisi başarısız olsa bile otomatik commit ettiği için diğer tüm bağlantılarda da görünecek. Bunun önüne geçmek için, AUTOCOMMIT değerini 0 yapmamız gerekiyor. Yani kodların en başına bir de şunu eklediğimizde;

$db->query('SET AUTOCOMMIT = 0');

Artık işlem sorunsuz şekilde çalışacaktır. Ancak bunun yerine PDO’nun metodlarını kullanmak tabi ki daha yararlı 🙂

Başka bir anlatımda görüşmek üzere, detaylı anlatım için videoma gözatabilirsiniz.

PHP Dizi Fonksiyonları

Merhaba arkadaşlar, bu makalede sizlere PHP’de diziler’de sıkça kullanılan dizi fonksiyonlarından bahsetmek istiyorum. Mümkün olduğunca örneklerle ve fonksiyonların eksik kaldığı yerlerde kendimce çözümlerle sizlere bu dizi mevzusunu aktaracağım. Şimdiden iyi okumalar 🙂
Okumaya devam et PHP Dizi Fonksiyonları

Mac’de Hızlı PHP Server Kullanımı

Mac’de herhangi bir klasörde hızlıca php server kurup php kullanmak isterseniz, terminal üzerinden kolayca bunu nasıl yapacağınızı göstereceğim.

Terminali açıp önce nerede olduğumuza bir bakalım. Daha sonra bir klasör oluşturalım test için.
Okumaya devam et Mac’de Hızlı PHP Server Kullanımı

PHP IDE için Deprecated Tanımı

Örneğin bir sistem geliştirdiniz ve bunu başkaları kullanıyor. Sistemin yeni versiyonunu çıkardığınızda bazı kullanılan fonksiyonları artık kullanmama kararı aldınız. Ancak fonksiyonları direk silmek sorun yaratır, bunun yerine diğer geliştiriciler kullanmak istediklerinde IDE’lerin otomatik algılayacağı ve deprecated olduğunu göstereceği bir şeyler yazmanız gerek? Okumaya devam et PHP IDE için Deprecated Tanımı

PHP ile Ayın Kaç Gün Olduğunu Bulma

Bu konuda daha önce JavaScript için şöyle bir yazı yazmıştım. Aynı işlemi PHP’nin takvim fonksiyonları ile kolayca yapmamız mümkün.

İlk olarak, hangi fonksiyonu kullanacağız ve parametreleri neler?

cal_days_in_month(takvim, ay, yıl);

Okumaya devam et PHP ile Ayın Kaç Gün Olduğunu Bulma

PHP ile A’dan Z’ye Kadar Yazdırmak

Bazen A’dan Z’ye kadar harfleri yazdırmak gerekiyor. Bu gibi durumlarda, php’de kullanacağımız 1-2 fonksiyon mevcut. Bir for döngüsü ile nasıl yapabileceğimize bakalım.

Okumaya devam et PHP ile A’dan Z’ye Kadar Yazdırmak

PHP ile HTTP Kimlik Doğrulaması

Bazı zamanlar belli bir adrese erişimde kimlik doğrulaması isteyebiliriz. Yani kullanıcı adı ve şifre yazarak sayfayı görüntülemesini. Ancak her zaman bir üyelik sistemimiz olmayabilir, bundan dolayı kimlik doğrulamanın alternatif bir yolunu sizlerle öğrenelim. Okumaya devam et PHP ile HTTP Kimlik Doğrulaması