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.
- Java Concurrency ve Multithreading Bölüm 5: Asenkron Akış ve Reactive Programming
- Java Concurrency ve Multithreading Bölüm 4: CompletableFuture ile Asenkron İşlemler
- Milyon Dolarlık Yazılım Projesi: PHP ile Adım Adım Geliştirme
- Java Concurrency ve Multithreading Bölüm 3: ExecutorService ve Thread Havuzları
- Milyon Dolarlık Bir Proje Kodluyoruz