Zend Framework - Çalışma Örneği

Bu bölümde, Zend Framework'te eksiksiz bir MVC tabanlı Çalışan Uygulamasının nasıl oluşturulacağını öğreneceğiz. Aşağıda verilen adımları izleyin.

1. Adım: Module.php

Öncelikle - myapp / module / Employee / src / dizini içinde bir Employee modülü oluşturmalı ve ardından ConfigProviderInterface arayüzünü uygulamalıyız.

Module sınıfı için tam kod aşağıdaki gibidir -

<?php  
namespace Employee;  
use Zend\ModuleManager\Feature\ConfigProviderInterface;  
class Module implements ConfigProviderInterface { 
   public function getConfig() {    
      return include __DIR__ . '/../config/module.config.php'; 
   }    
}

2. Adım: composer.json

Yapılandırın Tutorial modül içinde composer.json aşağıdaki kodu kullanarak otomatik yükleme bölümü altında.

"autoload": { 
   "psr-4": { 
      "Application\\": "module/Application/src/", 
      "Tutorial\\": "module/Tutorial/src/", 
      "Employee\\": "module/Employee/src/" 
   } 
}

Şimdi, bir composer update komutu kullanarak uygulamayı güncelleyin.

composer update

Composer komutu, uygulamada gerekli değişiklikleri yapacak ve aşağıdaki komut isteminde gösterildiği gibi günlükleri gösterecektir.

Loading composer repositories with package information 
Updating dependencies (including require-dev) 
   - Removing zendframework/zend-component-installer (0.3.0) 
   - Installing zendframework/zend-component-installer (0.3.1) 
   Downloading: 100%           
    
   - Removing zendframework/zend-stdlib (3.0.1) 
   - Installing zendframework/zend-stdlib (3.1.0) 
   Loading from cache  
    
   - Removing zendframework/zend-eventmanager (3.0.1) 
   - Installing zendframework/zend-eventmanager (3.1.0) 
   Downloading: 100%           
    
   - Removing zendframework/zend-view (2.8.0) 
   - Installing zendframework/zend-view (2.8.1) 
   Loading from cache  
    
   - Removing zendframework/zend-servicemanager (3.1.0) 
   - Installing zendframework/zend-servicemanager (3.2.0) 
   Downloading: 100%           
    
   - Removing zendframework/zend-escaper (2.5.1) 
   - Installing zendframework/zend-escaper (2.5.2) 
   Loading from cache  
   
   - Removing zendframework/zend-http (2.5.4) 
   - Installing zendframework/zend-http (2.5.5) 
   Loading from cache  
    
   - Removing zendframework/zend-mvc (3.0.1)
   - Installing zendframework/zend-mvc (3.0.4)  
   Downloading: 100%           
   
   - Removing phpunit/phpunit (5.7.4) 
   - Installing phpunit/phpunit (5.7.5) 
   Downloading: 100%           
  
Writing lock file 
Generating autoload files

Adım 3: Çalışan Modülü için module.config.php

Myapp / module / Employee / config altında aşağıdaki kodla modül yapılandırma dosyasını oluşturun, "module.config.php".

<?php  
namespace Employee;  
use Zend\ServiceManager\Factory\InvokableFactory; 
use Zend\Router\Http\Segment;  
return [ 
   'controllers' => [ 
      'factories' => [ 
         Controller\EmployeeController::class => InvokableFactory::class, 
      ], 
   ], 
   'view_manager' => [ 
      'template_path_stack' => ['employee' => __DIR__ . '/../view',], 
   ], 
];

Şimdi, Employee modülünü uygulama seviyesi yapılandırma dosyasında - myapp / config / modules.config.php - yapılandırın.

return ['Zend\Router', 'Zend\Validator', 'Application', 'Tutorial', 'Employee'];

4. Adım: EmployeeController

AbstractActionController'ı genişleterek yeni bir PHP sınıfı EmployeeController oluşturun ve bunu myapp / module / Employee / src / Controller dizinine yerleştirin.

Tam kod listesi aşağıdaki gibidir -

<?php  
namespace Employee\Controller;  
use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel;  
class EmployeeController extends AbstractActionController { 
   public function indexAction() { 
      return new ViewModel(); 
   } 
}

Adım 5: Yönlendirici Yapılandırması

Çalışan modülümüze bir segment rotası ekleyelim. Myapp / module / Employee / config'de bulunan çalışan modülü yapılandırma dosyası module.config.php'yi güncelleyin.

<?php  
namespace Employee;
use Zend\ServiceManager\Factory\InvokableFactory; 
use Zend\Router\Http\Segment;  
return [ 
   'controllers' => [ 
      'factories' => [ 
         Controller\EmployeeController::class => InvokableFactory::class, 
      ], 
   ], 
   'router' => [ 
      'routes' => [ 
         'employee' => [ 
            'type' => Segment::class,
            'options' => [ 
               'route' => '/employee[/:action[/:id]]',
               'constraints' => [
                  'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                  'id' => '[0-9]+', 
               ], 
               'defaults' => [ 
                  'controller' => Controller\EmployeeController::class,
                  'action' => 'index', 
               ], 
            ], 
         ], 
      ], 
   ], 
   'view_manager' => [ 
      'template_path_stack' => [ 
         'employee' => __DIR__ . '/../view', 
      ], 
   ], 
];

Çalışan modülümüz için yönlendirmeyi başarıyla ekledik. Sonraki adım, Employee uygulaması için bir görünüm komut dosyası oluşturmaktır.

6. Adım: ViewModel'i oluşturun

Myapp / module / Employee / view / calisan / calisan dizini altinda "index.phtml" adinda bir dosya olusturun.

Dosyaya aşağıdaki değişiklikleri ekleyin -

<div class = "row content"> 
   <h3>This is my first Zend application</h3> 
</div> 
Move to “EmployeeController.php” file and edit the following changes, 

<?php 
namespace Employee\Controller;  
use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel;  
class EmployeeController extends AbstractActionController { 
   public function indexAction() { 
      return new ViewModel();  
   } 
}

Son olarak Çalışan modülünü başarıyla tamamladık. aşağıdaki url'yi kullanarak ona erişebiliriz -http://localhost:8080/employee.

Sonuç

Bir sonraki adımda gerçekleştireceğiz add, edit ve deleteçalışan uygulamasındaki veri işlemleri. Bu işlemleri gerçekleştirmek için öncelikle bir veritabanı modeli oluşturmalıyız. Bir sonraki adımda açıklanmaktadır.

7. Adım: Bir Model Oluşturun

Model oluşturalım, Modülümüzde Çalışan src directory. Modeller genellikle Model klasörü altında gruplanır (myapp / module / Employee / src / Model / Employee.php)

<?php  
namespace Employee\Model;  
class Employee { 
   public $id; public $emp_name; 
   public $emp_job; 
}

Adım 8: MySQL Tablosu

Adlı bir veritabanı oluşturun tutorials aşağıdaki komutu kullanarak yerel MYSQL sunucusunda -

create database tutorials;

Adlı bir tablo oluşturalım employee veritabanında aşağıdaki SQL komutunu kullanarak -

use tutorials;  
CREATE TABLE employee ( 
   id int(11) NOT NULL auto_increment, 
   emp_name varchar(100) NOT NULL, 
   emp_job varchar(100) NOT NULL, 
   PRIMARY KEY (id) 
);

Verileri şuraya ekle: employee aşağıdaki sorguyu kullanan tablo -

INSERT INTO employee (emp_name, emp_job) VALUES ('Adam',  'Tutor'); 
INSERT INTO employee (emp_name, emp_job) VALUES ('Bruce',  'Programmer'); 
INSERT INTO employee (emp_name, emp_job) VALUES ('David',  'Designer');

Adım 9: Veritabanı Yapılandırmasını Güncelleyin

Global Configuration dosyasını, myapp / config / autoload / global.php'yi gerekli veritabanı sürücü bilgileriyle güncelleyin.

return [
   'db' => [
      'driver' => 'Pdo',
      'dsn' => 'mysql:dbname = tutorials;host=localhost',
      'driver_options' => [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''],
   ],
];

Şimdi, yerel yapılandırma dosyasındaki veritabanı kimlik bilgilerini güncelleyin - myapp / config / autoload / local.php. Bu şekilde, yerel ve canlı veritabanı bağlantı kimlik bilgilerini ayırabiliriz.

<?php 
return array( 
   'db' => array('username' => '<user_name>', 'password' => '<password>',), 
);

Adım 10: exchangeArray'i uygulayın

Employee modelinde exchangeArray işlevini uygulayın.

<?php 
namespace Employee\Model; 
class Employee { 
   public $id; 
   public $emp_name; public $emp_job;  
   public function exchangeArray($data) { $this->id = (!empty($data['id'])) ? $data['id'] : null; 
      $this->emp_name = (!empty($data['emp_name'])) ? $data['emp_name'] : null; $this->emp_job = (!empty($data['emp_job'])) ? $data['emp_job'] : null; 
   } 
}

Adım 11: Çalışan Verilerini almak için TableGateway'i kullanın

Model klasörünün kendisinde EmployeeTable sınıfı oluşturun. Aşağıdaki kod bloğunda tanımlanmıştır.

<?php  
namespace Employee\Model;  
use Zend\Db\TableGateway\TableGatewayInterface;  
class EmployeeTable { 
   protected $tableGateway; public function __construct(TableGatewayInterface $tableGateway) { 
      $this->tableGateway = $tableGateway; 
   }
   public function fetchAll() { 
      $resultSet = $this->tableGateway->select();  
      return $resultSet; 
   } 
}

Adım 12: EmployeeTable Sınıfını Yapılandırın

Module.php'deki çalışan hizmetini getServiceConfig () yöntemini kullanarak güncelleyin

<?php
namespace Employee;
use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Zend\ModuleManager\Feature\ConfigProviderInterface;

class Module implements ConfigProviderInterface {
   public function getConfig() {
      return include __DIR__ . '/../config/module.config.php';
   }
   public function getServiceConfig() {
      return [
         'factories' => [
            Model\EmployeeTable::class => function (    $container) {
               $tableGateway = $container>get( Model\EmployeeTableGateway::class);
               $table = new Model\EmployeeTable($tableGateway);
               return $table; }, Model\EmployeeTableGateway::class => function ($container) {
               $dbAdapter = $container->get(AdapterInterface::class);
               $resultSetPrototype = new ResultSet(); $resultSetPrototype->setArrayObjectPrototype(new Model\Employee());
               return new TableGateway('employee', $dbAdapter, null, $resultSetPrototype);
            },
         ],
      ];
   }
}

Adım 13: Denetleyiciye Çalışan Hizmetini Ekleyin

Employee Module Configuration'ın denetleyici bölümünü - myapp / module / config / module.config.php aşağıda gösterildiği gibi güncelleyin.

'controllers' => [
   'factories' => [
      Controller\EmployeeController::class => function($container) { return new Controller\EmployeeController( $container->get(Model\EmployeeTable::class)
         ); 
      }, 
   ], 
]

Adım 14: EmployeeController için Oluşturucu Ekleyin

Yapıcıyı şu şekilde ekleyin: EmployeeTable bağımsız değişken olarak ve aşağıdaki değişiklikleri düzenleyin.

<?php  
namespace Employee\Controller; 
use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel;
use Employee\Model\Employee; 
use Employee\Model\EmployeeTable;  

class EmployeeController extends AbstractActionController { 
   private $table; public function __construct(EmployeeTable $table) { 
      $this->table = $table; 
   }  
   public function indexAction() { 
      $view = new ViewModel([ 'data' => $this->table->fetchAll(), 
      ]);  
      return $view; 
   } 
}

15. Adım: Çalışan Bilgilerini "index.phtml" görünüm komut dosyasında görüntüleyin

Dosyaya taşı - index.phtml ve aşağıdaki değişiklikleri yapın -

<?php 
$title = 'Employee application'; 
$this->headTitle($title); 
?>  

<table class="table"> 
   <tr> 
      <th>Employee Name</th> 
      <th>Employee Job</th> 
      <th>Edit/Delete operations</th>
   </tr> 
   <?php foreach ($data as $empdata) : ?> 
   <tr>  
      <td><?php echo $this->escapeHtml($empdata->emp_name);?></td> 
      <td><?php echo $this->escapeHtml($empdata->emp_job);?></td> 
      <td> 
         <a href="<?php echo $this->url('employee', array('action'=>'edit', 'id' =>$empdata->id));?>">Edit</a> 
         <a href="<?php echo $this->url('employee', array('action'=>'delete', 'id' => $empdata->id));?>">Delete</a> 
      </td> 
   </tr> 
   <?php endforeach; ?> 
</table>

Şimdi başarıyla bir veritabanı modeli oluşturduk ve uygulama içindeki kayıtları getirebiliriz.

URL'yi kullanarak uygulamayı isteyin - http://localhost:8080/employee.

Sonuç

Bir sonraki adım, insert, edit ve delete çalışan modülündeki veri işlemleri.

Adım 16: Bir Çalışan Formu Oluşturun

Adlı bir dosya oluşturun EmployeeForm.phpmyapp / module / Employee / src / Form dizininde. Aşağıdaki kod bloğunda açıklanmıştır.

<?php  
namespace Employee\Form; 
use Zend\Form\Form;  

class EmployeeForm extends Form { 
   public function __construct($name = null) { / / we want to ignore the name passed parent::__construct('employee'); $this->add(array( 
         'name' => 'id', 
         'type' => 'Hidden', 
      )); 
      $this->add(array( 'name' => 'emp_name', 'type' => 'Text', 'options' => array( 'label' => 'Name', ), )); $this->add(array( 
         'name' => 'emp_job', 
         'type' => 'Text', 
         'options' => array( 
            'label' => 'Job', 
         ), 
      )); 
      $this->add(array( 
         'name' => 'submit', 
         'type' => 'Submit', 
         'attributes' => array(
            'value' => 'Go', 
            'id' => 'submitbutton', 
         ), 
      )); 
   } 
}

Adım 17: Çalışan Modelini Güncelleyin

Çalışan modelini güncelleyin ve InputFilterAwareInterface'i uygulayın. Myapp / module / Employee / src / Employee / Model dizinine gidin ve aşağıdaki değişiklikleriEmployee.phpfile.

<?php  
namespace Employee\Model;  

// Add these import statements 
use Zend\InputFilter\InputFilter; 
use Zend\InputFilter\InputFilterAwareInterface; 
use Zend\InputFilter\InputFilterInterface;  

class Employee implements InputFilterAwareInterface { 
   public $id; 
   public $emp_name; public $emp_job; 
   protected $inputFilter; public function exchangeArray($data) { 
      $this->id = (isset($data['id'])) ? $data['id'] : null; $this->emp_name = (isset($data['emp_name'])) ? $data['emp_name'] : null;         
      $this->emp_job = (isset($data['emp_job']))  ? $data['emp_job'] : null; } // Add content to these methods: public function setInputFilter(InputFilterInterface $inputFilter) { 
      throw new \Exception("Not used"); 
   }  
   public function getInputFilter() { 
      if (!$this->inputFilter) { $inputFilter = new InputFilter();  
         $inputFilter->add(array( 'name' => 'id', 'required' => true, 'filters' => array( array('name' => 'Int'), ), )); $inputFilter->add(array( 
            'name' => 'emp_name', 
            'required' => true, 
            'filters' => array( 
               array('name' => 'StripTags'), 
               array('name' => 'StringTrim'), 
            ), 
            'validators' => array( 
               array('name' => 'StringLength', 
                        'options' => array( 
                           'encoding' => 'UTF-8', 
                           'min' => 1, 
                           'max' => 50, 
                        ), 
                    ), 
                ), 
            ));
         $inputFilter->add(array( 'name' => 'emp_job', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array('name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 50, ), ), ), )); $this->inputFilter = $inputFilter; } return $this->inputFilter; 
   } 
}

Adım 18: Employee Controller'da addAction ekleyin

Aşağıdaki değişiklikleri ekleyin EmployeeController sınıf.

<?php  
use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 
use Employee\Model\Employee;       
use Employee\Model\EmployeeTable;    
use Employee\Form\EmployeeForm;

public function addAction() { 
   $form = new EmployeeForm(); $form->get('submit')->setValue('Add');  
   $request = $this->getRequest(); 
   
   if ($request->isPost()) { $employee = new Employee(); 
      $form->setInputFilter($employee->getInputFilter()); 
      $form->setData($request->getPost());  
      
      if ($form->isValid()) { $employee->exchangeArray($form->getData()); $this->table->saveEmployee($employee); // Redirect to list of employees return $this->redirect()->toRoute('employee'); 
      } 
   } 
   return array('form' => $form); 
}

Adım 19: EmployeeTable sınıfına kaydetme işlevselliği ekleyin

EmployeeTable sınıfına şu iki işlevi ekleyin - myapp / module / Employee / src / Model / EmployeeTable.php

public function getEmployee($id) { 
   $id = (int) $id; 
   $rowset = $this->tableGateway->select(array('id' => $id)); $row = $rowset->current(); if (!$row) { 
      throw new \Exception("Could not find row $id"); } return $row; 
}  
public function saveEmployee(Employee $employee) { $data = array (  
      'emp_name' => $employee->emp_name, 'emp_job' => $employee->emp_job, 
   );  
   $id = (int) $employee->id; 
   if ($id == 0) { $this->tableGateway->insert($data); } else { if ($this->getEmployee($id)) { $this->tableGateway->update($data, array('id' => $id)); 
      } else { 
         throw new \Exception('Employee id does not exist'); 
      } 
   } 
}

Adım 20: AddAction yöntemi, Add.phtml için Görünüm komut dosyası oluşturun

Uygulamam / modül / görünüm / çalışan / çalışan içindeki "Add.phtml" dosyasına aşağıdaki değişiklikleri ekleyin.

<?php 
   $title = 'Add new employee'; $this->headTitle($title); ?> <h1><?php echo $this->escapeHtml($title); ?></h1> <?php $form->setAttribute('action', $this->url('employee', array('action' => 'add'))); $form->prepare(); 
   echo $this->form()->openTag($form); 
   echo $this->formHidden($form->get('id')); 
   echo $this->formRow($form->get('emp_name'))."<br>"; 
   echo $this->formRow($form->get('emp_job'))."<br>";   
   echo $this->formSubmit($form->get('submit')); 
   echo $this->form()->closeTag(); 
Request the application using the url, http://localhost:8080/employee/add

Sonuç

Veriler eklendikten sonra, ana sayfaya yönlendirilecektir.

Adım 21: Çalışan Kayıtlarını Düzenleyin

Employee modülünde veri düzenleme işlemlerini gerçekleştirelim. Aşağıdaki değişiklikleri güncelleyinEmployeecontroller.php.

public function editAction() { 
   $id = (int) $this->params()->fromRoute('id', 0); if (!$id) { 
      return $this->redirect()->toRoute('employee', array( 'action' => 'add' )); } try { $employee = $this->table->getEmployee($id); 
   } catch (\Exception $ex) { return $this->redirect()->toRoute('employee', array( 
         'action' => 'index' 
      )); 
   }  
   $form = new EmployeeForm(); $form->bind($employee); $form->get('submit')->setAttribute('value', 'Edit');  
   $request = $this->getRequest(); 
   
   if ($request->isPost()) { $form->setInputFilter($employee->getInputFilter()); $form->setData($request->getPost()); if ($form->isValid()) { 
         $this->table->saveEmployee($employee);  
         
         // Redirect to list of employees 
         return $this->redirect()->toRoute('employee'); } } return array('id' => $id, 'form' => $form,); 
}

Burada arıyoruz id, eşleşen rotada olan ve ardından düzenleme işlemi için çalışan ayrıntılarını yükleyin.

Adım 22: Employee.php

Şimdi - myapp / module / Employee / src / Employee / Model / dizininde bulunan “Employee.php” dosyasına aşağıdaki değişiklikleri ekleyin.

public function getArrayCopy() { 
   return get_object_vars($this); 
}

Burada, Zend \ Stdlib \ Hydrator \ ArraySerializable, modelde iki yöntem bulmayı bekler: getArrayCopy() ve exchangeArray().

Burada exchangeArray () yineleme için kullanılır. Bu işlev, çalışan tablosundaki verileri bağlamak için kullanılır.

Şimdi, için bir görünüm betiği oluşturmamız gerekiyor editAction().

Adım 23: Edit.phtml oluşturun

/ Çalışan / görünüm / çalışan / çalışan / edit.phtml modülünde bir görünüm komut dosyası oluşturun

<?php 
   $title = 'Edit employee records'; $this->headTitle($title); ?> <h1><?php echo $this->escapeHtml($title); ?></h1> <?php $form = $this->form; $form->setAttribute('action', $this->url( 'employee', array('action' => 'edit', 'id' => $this->id,) 
)); 
$form->prepare(); echo $this->form()->openTag($form); echo $this->formHidden($form->get('id')); echo $this->formRow($form->get('emp_name'))."<br>"; echo $this->formRow($form->get('emp_job'))."<br>"; echo $this->formSubmit($form->get('submit')); echo $this->form()->closeTag();

Çalışan ayrıntılarının düzenlenmesi aşağıdaki ekran görüntüsünde gösterilmektedir.

Veriler düzenlendiğinde, ana sayfaya yönlendirilecektir.

Adım 24: deleteEmployee yöntemini ekleyin

EmployeeTable sınıfına deleteEmployee yöntemini ekleyin - myapp / module / Employee / src / Model / EmployeeTable.php

public function deleteEmployee($id) { $this->tableGateway->delete(['id' => (int) $id]); 
}

Adım 25: Çalışan Kayıtlarını Silin

Şimdi Employee modülünde veri silme işlemlerini gerçekleştirelim. Aşağıdaki yöntemi ekleyin,deleteAction EmployeeController sınıfında.

public function deleteAction() { 
   $id = (int) $this->params()->fromRoute('id', 0); if (!$id) { 
      return $this->redirect()->toRoute('employee'); } $request = $this->getRequest(); if ($request->isPost()) { 
      $del = $request->getPost('del', 'No');  
      if ($del == 'Yes') { $id = (int) $request->getPost('id'); $this->table->deleteEmployee($id); } return $this->redirect()->toRoute('employee'); 
   }  
   return array( 
      'id' => $id, 'employee' => $this->table->getEmployee($id) 
   ); 
}

Burada deleteEmployee () yöntemi, çalışanı kendi id ve çalışanlar listesi sayfasına (ana sayfa) yönlendirir.

Şimdi deleteAction () yöntemi için karşılık gelen bir görünüm komut dosyaları oluşturalım.

Adım 26: Bir Görünüm Komut Dosyası Oluşturun

Uygulamam / modül / Çalışan / görünüm / çalışan / çalışan / delete.phtml içinde delete.phtml adlı bir dosya oluşturun ve içine aşağıdaki kodu ekleyin.

<?php 
   $title = 'Delete an employee record'; 
   $this->headTitle($title);  
?> 
<h1><?php echo $this->escapeHtml($title); ?></h1>  

'<?php echo $this->escapeHtml($employee->emp_name); ?>' by 
'<?php echo $this->escapeHtml($employee->emp_job); ?&'?  
<?php 
   $url = $this->url('employee', array('action' => 'delete', 'id' => $this->id,)); ?> <form action ="<?php echo $url; ?>" method = "post">
   <div> 
      <input type = "hidden" name = "id" value = "<?php echo (int) $employee->id; ?>" /> 
      <input type = "submit" name = "del" value = "Yes" /> 
      <input type = "submit" name = "del" value = "No" /> 
   </div> 
</form>

Şimdi, herhangi bir çalışanı silin edit Ana sayfadaki bağlantı ve sonuç aşağıdaki ekran görüntüsünde gösterildiği gibi olacaktır.

Sonuç

Gerekli tüm özellikleri uygulayarak Çalışan modülünü başarıyla tamamladık.

Sonuç

Mevcut rekabet ortamında, Zend çerçevesi geliştirici tarafından en üst noktaya yerleştirilmiştir. PHP dilinde herhangi bir programa veya herhangi bir uygulama türüne soyutlamalar sağlar. Olgunlaştırılmış bir çerçevedir ve modern PHP dili özelliklerini destekler. Eğlenceli, profesyonel, gelişen ve mevcut teknolojiye ayak uyduruyor.