Milyon Dolarlık Yazılım Projesi: PHP ile MVC Yapısında Adım Adım Geliştirme

Yazılım dünyasında başarı, bir tesadüf mü? Yoksa bu başarıyı inşa eden ellerin ustalığı mı? Bu rehberimizde, sıfırdan bir yazılım projesi geliştirerek bu soruya birlikte yanıt arayacağız. Amacımız, PHP kullanarak güçlü ve profesyonel bir yazılım altyapısı kurmak. Ancak bu proje sıradan bir yazılım olmayacak; nihai hedefimiz, milyon dolarlık bir ürün yaratmak!

Bu rehberde, PHP’nin gücünden yararlanarak modern bir MVC yapısı oluşturacak, veritabanı entegrasyonu için MySQL kullanacak ve yazılımın her adımını adım adım açıklayacağız. Eğer hazırsanız, başlayalım!

.htaccess Yapılandırması

Öncelikle projemizin temiz URL yapısını ve güvenliğini sağlamak için .htaccess dosyasını oluşturuyoruz. İşte .htaccess dosyamızın içeriği:

Options -Indexes # Dizindeki dosya listelemesini engeller.
Options -MultiViews # URL otomatik tamamlama özelliğini kapatır.
RewriteEngine on # URL yeniden yazma motorunu aktif eder.
RewriteCond %{REQUEST_FILENAME} !-d # Fiziksel bir dizine eşleşmiyorsa kuralı uygular.
RewriteCond %{REQUEST_FILENAME} !-f # Fiziksel bir dosyaya eşleşmiyorsa kuralı uygular.
RewriteRule ^(.+)$ index.php?act=$1 [QSA,L] # URL'yi index.php üzerinden yönlendirir.
# Bu bölüm ise, .htaccess dosyasının doğrudan web tarayıcısından erişilmesini engeller.
<Files .htaccess>
	Order Allow,Deny
	Deny from all
</Files>

Bu ayarlar hem projemizin güvenliğini artırır hem de temiz URL yapısı sağlar.

MVC’nin Temelleri: Sistem ve Controller

Şimdi, Core klasörü altında projemizin temel yapısını oluşturalım. Bu klasörde iki dosya olacak:

  • system.php: Sistem yapılandırmasını yönetir.
  • controller.php: View dosyalarını çağırmamızı sağlar.

System.php İçeriği

<?php




class System
{

    protected $controller = 'main';
    protected $method = 'index';
    protected $params = [];
    protected $adminController = ADMIN_CONTROLLER;
    protected $controllerPath = CONTROLLER;


    public function run()
    {
        $url = self::parseUrl();
        $url = self::checkFile($url);
        $url = self::checkClass($url);
        $url = self::checkMethod($url);
        self::clearUrl($url);
        call_user_func_array([$this->controller, $this->method], $this->params);
    }

    public function clearUrl($url = [])
    {
        if (isset($url[0]) && isset($url[1])) {
            if ($url[0] == $this->controller && $url[1] == $this->method) {
                array_shift($url);
                array_shift($url);
            }
        }
        $this->params = $url;
    }


    public function parseUrl()
    {
        if (isset($_GET['action'])) {
            $url = explode('/', filter_var(rtrim(
                $_GET['action'],
                '/'
            ), FILTER_SANITIZE_URL));
        } else {
            $url[0] = $this->controller;
            $url[1] = $this->method;
        }
        return $url;
    }

    public function checkFile($url = [])
    {
        if ($url[0] == $this->adminController) {
            $controllerPath = $this->adminController;
        } else {
            $controllerPath = $this->controllerPath;
        }
        if (file_exists($controllerPath . $url[0] . '.php')) {
            $this->controller = $url[0];
            array_shift($url);
            require_once $controllerPath . $this->controller . '.php';
        } else {
            require_once $controllerPath . $this->controller . '.php';
        }
        return $url;
    }

    public function checkClass($url = [])
    {
        if (class_exists($this->controller)) {
            $this->controller = new $this->controller;
        } else {
            echo 'sınıf bulunamadı';
        }
        return $url;
    }

    public function checkMethod($url = [])
    {
        if (isset($url[0])) {
            if (method_exists($this->controller, $url[0])) {
                $this->method = $url[0];
                array_shift($url);
            }
        }
        return $url;
    }
}

Controller.php İçeriği

<?php

class Controller
{



    public function view($theme, $file, $parameters = [], $isIncFiles = true)
    {
        if (file_exists(VIEW_PATH . $theme . '/' . $file . '.php')) {
            if ($isIncFiles) {
                require VIEW_PATH . $theme . '/inc/header.php';
            }

            require VIEW_PATH . $theme . '/' . $file . '.php';

            if ($isIncFiles) {
                require VIEW_PATH . $theme . '/inc/footer.php';
            }
        } else {
            echo 'View not found';
        }
    }
}

Temel Yapılandırma: Config, Init ve Index

Şimdi ana dizinde üç dosya oluşturalım:

  • config.php: Sistemin temel ayarları ve veritabanı bilgileri burada yer alır.
  • init.php: Sistem dosyalarını çağırır.
  • index.php: Giriş noktasıdır ve sistemi başlatır.

Config.php

<?php

// DATABASE CONFIGURATION
define('DB_HOST', 'localhost');
define('DB_NAME', 'sizdeki_db_adi');
define('DB_USER', 'sizdeki_db_kullanicisi');
define('DB_PASS', 'sizdeki_db_sifresi');
define('DB_CHARSET', 'utf8');
define('DB__PORT', 3306);



// SYSTEM CONFIGURATION
define('CONTROLLER', 'app/controllers/');
define('ADMIN_CONTROLLER', 'app/controllers/admin/');
define('MODEL', 'app/models/');
define('VIEW_PATH', 'templates/');
define('PUBLIC_PATH', 'public/');

Index.php

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

try {
    require_once 'init.php';
    $system = new System();
    $system->run();
} catch (Exception $e) {
    echo $e->getMessage();
}

Init.php

<?php


require_once 'config.php';

require_once 'core/controller.php';
require_once 'core/system.php';

Yeni Controller: Contacts

<?php



class contacts extends Controller
{
    public function index()
    {
        $this->view("user", "main", [], false);
    }

    public function add()
    {
        
    }
    public function edit()
    {
        echo 'contactsedit methodu çalıştı';
    }
}

Bu adımlar sonucunda sistemimiz çalışır hale gelecektir. Projeyi tarayıcıda contacts/add gibi bir route kullanarak test edebilirsiniz.


Bu makalede, PHP ile sıfırdan bir yazılım projesinin temellerini attık. .htaccess yapılandırmasından MVC yapısına kadar birçok önemli noktayı ele aldık. Bir sonraki adımda, sistemimizi daha da geliştirecek ve projeyi profesyonel bir seviyeye taşıyacağız.

Herhangi bir sorunla karşılaşırsanız, youtube videosu altında yorumlar kısmından destek alabilirsiniz! Github reposuna ise buradan ulaşabilirsiniz.