Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

kendi yazdigim framework Smceframework-MVC

Konu, 'Framework / MVC' kısmında ceida tarafından paylaşıldı.

  1. ersink

    ersink Daimi Üye

    Kayıt:
    26 Temmuz 2010
    Mesajlar:
    906
    Beğenilen Mesajlar:
    5
    Meslek:
    Med Student
    Şehir:
    Ankara
    Anlatamadım ben derdimi. Daha farklı bir şeyden bahsediyorum. Neyse kodlara biraz bakınayım dedim, gözüme çarpan şeyleri paylaşayım:

    framework/smceframework/base/SmBase.php:

    PHP:
        public static function run()
        {
            
    session_start();
            
    self::router();
            if(isset(
    self::$config["components"]["activerecord"]) && count(self::$config["components"]["activerecord"])>0)
                
    self::dbSetting();
            
    self::command();
        }
    Mesela bu kod bloğunda ilk gözüme çarpan çok fazla void fonksiyon var. Sonra neden her şey static? Bir sınıf methodunda session_start fonksiyonu ne arıyor? If bloğu neden parantezsiz?

    PHP:
     private static function setSmRouter($request)
        {
            
    $SmRouter=new SmRouter;
            
            
    $SmRouter->setRequest($request);
            if(isset(
    $_GET["route"]))
                
    $SmRouter->setRoute($_GET["route"]);
            if(isset(
    self::$config["urlrouter"]))
                
    $SmRouter->setRouter(self::$config["urlrouter"]);
            
            return 
    $SmRouter->run();
        }
    Method içerisinde farklı bir class'ın instance'ı yaratılmış. Methodların içinde new kelimesi geçmemeli. En kötü __contruct içinde yapılmalı ki doğrusu injectiondır.

    PHP:

        
    private static function setControllerView($requestArray)
        {
            if(isset(
    $requestArray)){
                foreach (
    $requestArray as $key => $value)
                    
    $_GET[$key]=$value;
                
            }
            
              
    self::$controller=strtolower($requestArray["controller"]);
            
    self::$view=strtolower($requestArray["view"]);
            
        }
    HTTP globali içerisine neden değer tanımlanıyor burada? $_GET'ten veri alırsınız fakat neden atama yaptığınızı anlamadım.

    PHP:
    private static function isController()
        {
            if (! 
    class_exists(ucfirst(self::$controller)."Controller")) {
                
    SmHttpException::htppError(404,"Controller Not Found");
                exit();
            }
        }
    Statik method isminde typo yapmışsınız sanırım, htpp değil http olacakmış. Ve isX() isimlendirmesinde olan bir fonksiyon boolean döndürmeli void olamaz. Exception'ları throw ile fırlatmalısınız. exit() ile çıkılmaz.

    PHP:
     private static function isComponentsController()
        {
            if (
    class_exists("CController")) {
                return new \
    CController;
            }else
                return 
    "";
        }
    Aynı şekilde, boolean dönmesi gerekiyor. Yeni instance oluşturmamak gerek yukarıda bahsettiğim gibi. Boş string döndürmemek gerek.

    PHP:
    if($SmACL->rules($accessRules,self::$view,Smce::app()->IP,Smce::app()->getState(md5(md5("SMCE_".Smce::app()->securitycode)))))
    PSR sadece namespace kullanımı ile ilgili değildir, bu satır PSR'a göre idamlık maalesef.

    PHP:
    header('HTTP/1.0 404 Not Found');
                            
    SmHttpException::htppError(404,"You do not have authority to allow");
    Exception'ı throw ile fırlatıp header olayını da bu exception class içinde halletmeniz gerekiyor. header'ın kullanımı çok yanlış.

    PHP:

                    
    try
                    {
                        
    $class->$actionView();
                        
    self::controllerAction($componentsController,"afterAction");
                    }catch(
    SmHttpException $e){
                         
    SmHttpException::htppError($e->getHttpCode,$e->getMessage());
                    }
    Aynı exception'ı yakalayıp, tekrar oluşturup tekrar fırlatmışsınız burada.

    Bu hatalar OOP mimarisini tam olarak yalayıp yutmadığınız için ortaya çıkan hatalar. Yani daha OOP'ye tam olarak hakim değilsiniz ve sizin bırakın nesneyi sınıfı bunların design patternlerinin hemen hepsine hâkim olup uygun olanı doğru olarak kullanmanız gerekiyor. Kusura bakmazsanız framework tamamen spagetti olmuş gibi gözüküyor, sadece bu dosyaya bakarak bile söyleyebilirim bunu. Kesinlikle refactor edilmesi gerek.

    Hâl böyleyken bu benchmarklardaki başarıların bir anlamı olmuyor. Daha OOP mimarisinin, basit patternlerin onları da geçtim if bloğuna parantez koymanın gereklerini yerine getirmeden bu frameworklerle kıyaslamanızı ve pazarlamayı tamamen bunun üzerinden yapmanızı doğru bulmuyorum.

    Kullanıcının model tanımladığı, controller yazdığı class'lar büyük frameworklere benziyor olabilir ama Smce'ye bir framework diyemeyeceğim şu anki hâliyle çok üzgünüm.

    Refactor edilip, aklınızdaki performans fikirlerini daha temiz, daha uygun şekilde yazmalısınız sağlam bir şeyler ortaya çıkarmak istiyorsanız.

    Bunları emeğinizi yerden yere vurmak için yazmadım inanın bana. Ama emek vermeye devam edecekseniz, temelin pek sağlam olmadığını bilmenizi isterim.
     
  2. ceida

    ceida Üye

    Kayıt:
    9 Ekim 2008
    Mesajlar:
    239
    Beğenilen Mesajlar:
    0
    Teşşekürler eksikler düzeltildi.

    PHP:
     private static function setControllerView($requestArray)
        {
            if(isset(
    $requestArray)){
                foreach (
    $requestArray as $key => $value)
                    
    $_GET[$key]=$value;
                
            }
    burada router C Extension ile yazıldı. gelen routerdaki elemanları GET fonksyionuna yazıyor. /index.php/asd/adas/232/2323.
     
  3. deathisonitsway

    deathisonitsway x-coder

    Kayıt:
    7 Kasım 2007
    Mesajlar:
    6,140
    Beğenilen Mesajlar:
    6
    Meslek:
    php-coder
    Şehir:
    abroad
    ersink nın dediği tüm şeyleri refactor et ceida..kendi kullanacağın sistemi mi yarattın yoksa millet kullansın diyemi...
     
  4. ceida

    ceida Üye

    Kayıt:
    9 Ekim 2008
    Mesajlar:
    239
    Beğenilen Mesajlar:
    0
    yukarıdaki görünenleri refectoring yaptım şuan itibariyle.

    PHP:
    throw new SmHttpException(403,'The requested page does not exist.');
    hata fırlatma işlemi bu şekilde. Biricisi hata kodu, ikinci kısım ekranda gösterilecek mesaj.

    Header kısmı Exceptioion clasına taşındı. Aşağıdaki listede Koda göre header hatası dönderiyor.


    PHP:
     case 100$text 'Continue'; break;
                case 
    101$text 'Switching Protocols'; break;
                case 
    200$text 'OK'; break;
                case 
    201$text 'Created'; break;
                case 
    202$text 'Accepted'; break;
                case 
    203$text 'Non-Authoritative Information'; break;
                case 
    204$text 'No Content'; break;
                case 
    205$text 'Reset Content'; break;
                case 
    206$text 'Partial Content'; break;
                case 
    300$text 'Multiple Choices'; break;
                case 
    301$text 'Moved Permanently'; break;
                case 
    302$text 'Moved Temporarily'; break;
                case 
    303$text 'See Other'; break;
                case 
    304$text 'Not Modified'; break;
                case 
    305$text 'Use Proxy'; break;
                case 
    400$text 'Bad Request'; break;
                case 
    401$text 'Unauthorized'; break;
                case 
    402$text 'Payment Required'; break;
                case 
    403$text 'Forbidden'; break;
                case 
    404$text 'Not Found'; break;
                case 
    405$text 'Method Not Allowed'; break;
                case 
    406$text 'Not Acceptable'; break;
                case 
    407$text 'Proxy Authentication Required'; break;
                case 
    408$text 'Request Time-out'; break;
                case 
    409$text 'Conflict'; break;
                case 
    410$text 'Gone'; break;
                case 
    411$text 'Length Required'; break;
                case 
    412$text 'Precondition Failed'; break;
                case 
    413$text 'Request Entity Too Large'; break;
                case 
    414$text 'Request-URI Too Large'; break;
                case 
    415$text 'Unsupported Media Type'; break;
                case 
    500$text 'Internal Server Error'; break;
                case 
    501$text 'Not Implemented'; break;
                case 
    502$text 'Bad Gateway'; break;
                case 
    503$text 'Service Unavailable'; break;
                case 
    504$text 'Gateway Time-out'; break;
    static fonksyionlar düzeltildi bencmarka tabi tutuldu sorun yok.

    Diğer classlarada bakacam zamanla. Bu framework ansızın bir proje için kullanılacakken, framework haline getirdim. çok kısa zamanda yaptıgım için refectoring gerekiyor. İlk başladıgımda sadece MC olacaktı model ve controller. Çok fazla bir class yoktu. Sonra düşündüm hadi MVC olsun herkes kullansın dedik. Sonra View girince o Olsun bu olsun şu olsun derken bu noktadayım :D Sonra Bazı çalışan kısımları C Extend haline çevirem dedim. öyle öyle gidiyor.

    --- Ekleme ---

    Sesion_start içerde login sistemi var. LoginForm Model var bu sistem login oldurmayı sağlıyor. Ve Aynı tarayıcıda birden fazla projeyi Session karışmadan şifreleme metodu kullanılıyor.
     
  5. ersink

    ersink Daimi Üye

    Kayıt:
    26 Temmuz 2010
    Mesajlar:
    906
    Beğenilen Mesajlar:
    5
    Meslek:
    Med Student
    Şehir:
    Ankara
    Class içerisinde session olmaz, ayrıca cookie'leri neden kullanmıyorsunuz? Auth sistemi hiç modüler değil gibi gözüküyor şu an. Belki ben Cartalyst ekibinin Sentry paketini vs. kullanmak istiyorum, bu framework'e nasıl yedireceğim bu hâliyle? :)
     
  6. ceida

    ceida Üye

    Kayıt:
    9 Ekim 2008
    Mesajlar:
    239
    Beğenilen Mesajlar:
    0
    neden olmaz bir açıklama istiyorum :D nerde başlatacaz. Bu php fonksiyonu saymıyormusunuz :)
     
  7. deathisonitsway

    deathisonitsway x-coder

    Kayıt:
    7 Kasım 2007
    Mesajlar:
    6,140
    Beğenilen Mesajlar:
    6
    Meslek:
    php-coder
    Şehir:
    abroad
    neden olmaz en basit haliyle...ana controller dosyanda yada mainde..bir session tanımladın doğal haliyle ve routing yapmaya basladın..bir dosyada bu methodu kullandıgın zaman session_already hatası yersin...
     
  8. ersink

    ersink Daimi Üye

    Kayıt:
    26 Temmuz 2010
    Mesajlar:
    906
    Beğenilen Mesajlar:
    5
    Meslek:
    Med Student
    Şehir:
    Ankara
  9. ceida

    ceida Üye

    Kayıt:
    9 Ekim 2008
    Mesajlar:
    239
    Beğenilen Mesajlar:
    0
  10. deathisonitsway

    deathisonitsway x-coder

    Kayıt:
    7 Kasım 2007
    Mesajlar:
    6,140
    Beğenilen Mesajlar:
    6
    Meslek:
    php-coder
    Şehir:
    abroad
    PHP:

    Smce
    ::print_r()->get("data");

    gibi olmasında :) ustam bana göre en iyi fw su an icin symphony gibi görünüyor...
     
  11. ceida

    ceida Üye

    Kayıt:
    9 Ekim 2008
    Mesajlar:
    239
    Beğenilen Mesajlar:
    0
    Ne alaka :D
     
  12. ceida

    ceida Üye

    Kayıt:
    9 Ekim 2008
    Mesajlar:
    239
    Beğenilen Mesajlar:
    0
    smce2

    Smce2 Yazıyorum şuan sizin yorumlarınızdan etkilendim :D :D

    Smce2 'de framework dosyası bulunmayacak. Herşey Extend C üzerinden işleyecek. Yapılar bağımsız olacak. Bir model dosyasında Orm ister framework'kün ormsi isterse doctorine vs kullanabilecek. Hız testleri şuan başarılı, include framework derdi bitti.

    EventManager yaptım şöyle bir yapısıvar. Web sitenin bir bölgesinden bind ve push bir değer atayıp. Bunu static ramde tutuluyor.Sonraki akkışta istediği dosyadan geri çekebiliyor. Örnek göstermek gerekirse.



    PHP:
    //php dosyası

    $event=new Smce\Core\EventManager;

    $event->bind("config",function(){

        return array(
            
    "basepath"=>dirname(__FILE__),
            
    "title"=>"Smceframework",
            
    'description'=>"Smce is a web PHP framework implemented as a C extension, offering high performance, secure, flexible and simple. PHP Framework download.",
            
    'keyword'=>"smce, smceframework, php, framework, web, samed ceylan",
        );


    });


    //php dosyası

    $config=Smce\Core\EventManager::get("config"); //array



    PHP:
    //php dosyası

    $event =new Smce\Core\EventManager;

    $event->push("topla",function($a,$b){

         return  
    $a+$b;

     });



    //php dosyası

      
    $topla=Smce\Core\EventManager::get("topla");

      echo 
    $topla(2,4); //6



    PHP:
    //php dosyası

     
    $event =new Smce\Core\EventManager;

     
    $user="foo";

     
    $event->push("hello",function()   use ($user){

             return  
    "Hello $user";

     });

          


    //php dosyası

       
    $hello=Smce\Core\EventManager::get("hello");

      echo 
    $hello(); //Hello foo




    PHP:
    //php dosyası

       
    $event =new Smce\Core\EventManager;

       
    $event->push("plus",function(&$x){


              
    $x 123;

       });

          


    //php dosyası

       
    $x=NULL;

       
    $a=Smce\Core\EventManager::get("plus");
       
    $a($x);
      
      echo 
    $x//123

    --- Ekleme ---

    yine smcede MVC mizi kendimiz oluşturabiliyoruz. index.php altında

    bu şekilde hangi klasörleri load olmasını belirtiyoruz. sessionRegister() ise Session_start yapıyor. İsterse adam session kulllanmayacak. Kişi istediği kadar loader klasörü ayarlayabilir. Bu klasörler spl_autoload_register şeklinde dosyalar çağrılıyor.

    PHP:
    $loader=new Smce\Core\Loader;

    $loader->setDir(array(

                
    dirname(__FILE__)."/mvc/controller",
                
    dirname(__FILE__)."/mvc/model"

            
    )
        );

    $loader->register();

    $loader->sessionRegister();

    ORM şuan yapım aşamasında geliştiyorum. Aşağıda orm ayarlarını yapabilecek. Birden fazla db ayarı atayabilecek. Mo

    PHP:
    $event->bind("orm",function(){

        return array(

            
    "db1"=>array(

                
    "host"         => "mysql:host=127.0.0.1",
                
    "username"  => "root",
                
    "password"  => "",
                
    "dbname"    => "",
                
    "chartset"  => "utf8"
            
    )

        );

    });
     
  13. Aristona

    Aristona Daimi Üye

    Kayıt:
    12 Eylül 2010
    Mesajlar:
    551
    Beğenilen Mesajlar:
    1
    Meslek:
    İşsiz
    Şehir:
    Narnia
    Şunları da bir DI konteynerine eklerseniz daha şık olur.

    Smce::bind('EventManager', function() {
    return new Smce\Core\EventManager;
    });

    $event = Smce::resolve('EventManager');
    $event->listen('database.querying', function($event, $query) {
    Log::info(sprintf('Veritabanı sorgusu: %s', $query));
    });

    Bu arada, C extensionu yazmak iyi birşey değil. Debug etmek zor. Genellikle PHP geliştiricileri sıcak bakmıyor buna çünkü birçok konuda elinizi kolunuzu bağlıyor. Performanslı mı? Evet, ama büyük ölçekli projelerde (hatta bana kalırsa orta ve küçük dahil) pek önemsenmiyor framework performansı. Şuana kadar PHP'in bottleneck olduğu herhangi bir proje görmedim. Genellikle IO işlemleri sıkıntılı oluyor. Aşırı derecede çok IO alan durumlarda kullanışlı oluyor C extensionları. Misal, Google Analytics gibi birşeyin API tarafını yazarken çok önemli oluyor framework performansı. Zaten HHVM çok stabil bir halde. JIT compiler daha performanslı çalışıyor.

    [COLOR=#007700][FONT=monospace][COLOR=#DD0000][FONT=monospace][COLOR=#007700][FONT=monospace][COLOR=#0000BB][FONT=monospace][COLOR=#007700][FONT=monospace][COLOR=#0000BB][FONT=monospace][COLOR=#007700][FONT=monospace][COLOR=#0000BB][FONT=monospace][COLOR=#007700][FONT=monospace][COLOR=#FF8000][FONT=monospace]

    Buna gerek yok. __call veya __get ile gelen isteği call_user_func_array üzerinden oluşturduğunuz bindinge forward edebilirsiniz. Yani şöyle birşeyin çalışması lazım:

    EventManager.php

    public function __call(...)
    {
    if(!is_callable($this->bindings[$binding])
    {
    throw new MethodNotFoundException;
    }

    return call_user_func_array($this->bindings[$binding], (array) $params);
    }

    2. versiyonun kodlarına bakmadım ama 1.sindeki en büyük hatanız aşırı şişman methodlarınızın olmasıydı. Biraz parçalarsanız çok daha şık bir çekirdeğiniz olacaktır.[/font][/color][/font][/color][/font][/color][/font][/color][/font][/color][/font][/color][/font][/color][/font][/color][/font][/color][/font][/color]
     
  14. ceida

    ceida Üye

    Kayıt:
    9 Ekim 2008
    Mesajlar:
    239
    Beğenilen Mesajlar:
    0

    Teşşekürler yorumlaruınız için bunları uygulayacagım. İlk başta C etend olarak Zend dire kullanıyordum. Bir type hatası çalışır gibi gözüksekde 15 20 kere sayfa yenilemeden 500 hatası veriyordu. Zephiri duydum ve zephirle geliştirmeyi tercih ettim. Smce1 bu yüzden zephir biraz geç kaldık. Ve sizlerin yorumlarınızla rotayı değiştirdim. Şuan bencmarkta Smce2 smce1 den daha hızlı.

    --- Ekleme ---

    PHP:
    $di = new Smce\Core\DI();

    $di->bind("EventManager",function(){

        return new 
    Smce\Core\EventManager;

    });

    $event=Smce\Core\DI::resolve("EventManager");


    $event->bind("router",function(){

        
    $router=new Smce\Mvc\Router;

        if(isset(
    $_GET["route"]))
        {

            
    $router->setRoute($_GET["route"]);

        }
        
    /*
        $router->setRouter(array(

            "all"=>array("id"),

        ));

        */

        
    return $router;

    });

    şöyle bişeymi hocam :)

    --- Ekleme ---

    Saol hocam şu mantıkla yaptım güzel curk diye oturdu :)

    PHP:


        
    public static function __callStatic($event,$params)
        {

            
    $es str_replace("get","",$event);

            if(!isset(
    self::$events[$es]) || !is_callable(self::$events[$es])
            {

                throw new \
    Exception("Method Not Found Exception");
                
            }

            return 
    call_user_func_array(self::$events[$es], (array) $params);
        }




    PHP:
       $event=Smce\Core\DI::resolve("EventManager");

            
    $event->push("topla",function($a,$b){


                return  
    $a+$b;

            });

            echo 
    Smce\Core\EventManager::getTopla(2,4);
    --- Ekleme ---

    şuanki bilgisayarla bencmark testim.

    Smce 1 ONLY PHP


    Kod:
    ab -n 2000 -c 10 http://localhost/smceframework/frameworkonlyphp/benchmark/index.php
    This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    
    Benchmarking localhost (be patient)
    Completed 200 requests
    Completed 400 requests
    Completed 600 requests
    Completed 800 requests
    Completed 1000 requests
    Completed 1200 requests
    Completed 1400 requests
    Completed 1600 requests
    Completed 1800 requests
    Completed 2000 requests
    Finished 2000 requests
    
    
    Server Software:        Apache/2.4.7
    Server Hostname:        localhost
    Server Port:            80
    
    Document Path:          /smceframework/frameworkonlyphp/benchmark/index.php
    Document Length:        11 bytes
    
    Concurrency Level:      10
    Time taken for tests:   0.399 seconds
    Complete requests:      2000
    Failed requests:        0
    Total transferred:      786000 bytes
    HTML transferred:       22000 bytes
    Requests per second:    5012.24 [#/sec] (mean)
    Time per request:       1.995 [ms] (mean)
    Time per request:       0.200 [ms] (mean, across all concurrent requests)
    Transfer rate:          1923.64 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   0.1      0       2
    Processing:     1    2   0.8      2       6
    Waiting:        1    2   0.8      2       6
    Total:          1    2   0.8      2       6
    
    Percentage of the requests served within a certain time (ms)
      50%      2
      66%      2
      75%      2
      80%      3
      90%      3
      95%      4
      98%      4
      99%      4
     100%      6 (longest request)
    
    

    Smce 2


    Kod:
    ab -n 2000 -c 10 http://localhost/mvc/helloworld/index.php
    This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    
    Benchmarking localhost (be patient)
    Completed 200 requests
    Completed 400 requests
    Completed 600 requests
    Completed 800 requests
    Completed 1000 requests
    Completed 1200 requests
    Completed 1400 requests
    Completed 1600 requests
    Completed 1800 requests
    Completed 2000 requests
    Finished 2000 requests
    
    
    Server Software:        Apache/2.4.7
    Server Hostname:        localhost
    Server Port:            80
    
    Document Path:          /mvc/helloworld/index.php
    Document Length:        11 bytes
    
    Concurrency Level:      10
    Time taken for tests:   0.246 seconds
    Complete requests:      2000
    Failed requests:        0
    Total transferred:      396000 bytes
    HTML transferred:       22000 bytes
    Requests per second:    8142.13 [#/sec] (mean)
    Time per request:       1.228 [ms] (mean)
    Time per request:       0.123 [ms] (mean, across all concurrent requests)
    Transfer rate:          1574.36 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   0.1      0       1
    Processing:     0    1   0.7      1       6
    Waiting:        0    1   0.6      1       5
    Total:          0    1   0.7      1       6
    
    Percentage of the requests served within a certain time (ms)
      50%      1
      66%      1
      75%      1
      80%      1
      90%      2
      95%      3
      98%      3
      99%      4
     100%      6 (longest request)
    
    
    arada 1.5 kat hız farkı var
     
  15. Aristona

    Aristona Daimi Üye

    Kayıt:
    12 Eylül 2010
    Mesajlar:
    551
    Beğenilen Mesajlar:
    1
    Meslek:
    İşsiz
    Şehir:
    Narnia
  16. ceida

    ceida Üye

    Kayıt:
    9 Ekim 2008
    Mesajlar:
    239
    Beğenilen Mesajlar:
    0
    Buiş zevkli olmaya başladı :) . Buna remove, reset nesneleri eklemek gerek.

    PHP:
            $di=new Smce\Core\DI;

            
    $di->bind("EventManager",function(){

                return new 
    Smce\Core\EventManager;
                
            });




            
    $di->bind("gonder",function(){

                
    $event=Smce\Core\DI::resolve("EventManager");

                
    $event->push("araskargo",function($name){

                    return 
    $name." - Aras kargo ile Gönderildi";

                });

                return 
    $event;

            });




            
    $di->bind("gonder",function(){

                
    $event=Smce\Core\DI::resolve("EventManager");

                
    $event->push("pttkargo",function($name){

                    return 
    $name." - Ptt kargo ile Gönderildi";

                });

                return 
    $event;

            });




            
    $kargo=Smce\Core\DI::resolve("gonder");
            echo 
    $kargo::getPttkargo("Koli1");

            echo 
    "<br>";
            echo 
    $kargo::getAraskargo("Koli2");
    --- Ekleme ---

    Session

    Aynı sunucuda bulunan birden fazla uygulamalar için geliştirildi. Farklı oturumlar veya aynı oturumlar yapmamız mevcuttur bu sistemle.

    index.php

    PHP:
    $di=new Smce\Core\DI;

    $di->bind("app1ses",function(){

         
    $session = new Smce\Components\Session;
         
    $session->setSecurity(md5("%22AFbsaU"));
         
    $session->register();
         return 
    $session;

    });


    $di->bind("app2ses",function(){

         
    $session = new Smce\Components\Session;
         
    $session->setSecurity(md5("Ac2385Cs6"));
         
    $session->register();
         return 
    $session;

    });


    controller


    PHP:


        
    public function actionIndex3()
        {


            

            
    Smce\Core\DI::resolve("app1ses")->set("ID",53); //set
            

            
    Smce\Core\DI::resolve("app2ses")->set("ID",28); //set
            



        
    }


        public function 
    actionIndex4()
        {

            
            echo 
    Smce\Core\DI::resolve("app1ses")->get("ID"); //53
            
    echo "<br>";
            echo 
    Smce\Core\DI::resolve("app2ses")->get("ID"); //28

            
    Smce\Core\DI::resolve("app1ses")->remove("ID"); // app1ses remove ID
            
    Smce\Core\DI::resolve("app2ses")->remove("ID"); // app2ses remove ID


            
    Smce\Core\DI::resolve("app1ses")->reset(); // reset app1ses
            
    Smce\Core\DI::resolve("app2ses")->reset(); // reset app2ses
        
    }

    --- Ekleme ---

    @Aristona teşekkür ederim :) Di nesnesi iyi iş yaptı süper framework çekirdeği oluşturdu. DIInterface 3 nesnede oluşturacam pek kullanılmaz ama dursun. DI nin kopyası olacak.


    Loader

    Loder Psr-0 kurallarına göre yazıldı. setDir() nesnesi daha önce register edilen bir Folder varsa array_merge üstüne tekrar folder ekleyebiliyoruz.Örnek index.php' de loader register ettik. Controller dosyasında tekrar bir başka folder register edebiliriz.


    PHP:
    $di=new Smce\Core\DI;


    $di->bind("loader",function(){

        
    $loader=new Smce\Core\Loader;

        
    $loader->setDir(array(
            
    dirname(__FILE__)."/main/controller",
            
    dirname(__FILE__)."/main/model",
        ));

        return 
    $loader;
    });


    $loader=Smce\Core\DI::resolve("loader");
    $loader->register();

    Person ve Person\Sub Model içinde klasör/dosya şekilinde psr -0 göre çağrılıyor.

    PHP:
            $person= new Person;
            
            echo 
    $person->get();

            echo 
    "<br>";
            
            
    $personSub= new Person\Sub;
            
            echo 
    $personSub->get();
    --- Ekleme ---

    DIInterface

    PHP:
    $interface=new Smce\Core\DIInterface;
    $interface->bind("di",function(){

        return new 
    Smce\Core\DI;
    });

    $di=Smce\Core\DIInterface::resolve("di");
     
  17. Aristona

    Aristona Daimi Üye

    Kayıt:
    12 Eylül 2010
    Mesajlar:
    551
    Beğenilen Mesajlar:
    1
    Meslek:
    İşsiz
    Şehir:
    Narnia
    Rica ederim, ne demek. Bu tarz event tabanlı sistemler benim çok hoşuma gidiyor. DI konteyneri kullanmak da uygulamayı çok flexible bir hale getiriyor. Tabi bu en basic hali, ama geliştirilebilir. Mesela ReflectionClass + DI combosunu deneyebilirsin bir sonraki geliştirmede.

    Tekrar birşeyler söyleyeyim, gidiş yolun güzel.

    1. İlk örneğini anladığımı söyleyemem. Neden konteynere gonder methodu bindliyorsun? Nesne yönelimli düşünürsek, `gonder` methodunu göndereceğin nesneye bindleyip `ulaş` methodu ekleyebilirsin (ve ulaş methodu içinde onun son kullanıcıya nasıl ulaşacağını yazabilirsin, işte mesafe uzaksa kargocu seç [en düşük ücreti alan kargocuyu seç], mesafe kısaysa elden ver gibi) veya $kargo->gonder($kargo, $alici->location) tarzı birşey yazıp implementasyonu sınıflarda yapabilirsin.

    2. Ayırabildiğin herşeyi ayır.

    new Session(); yerine,
    new Session(new RedisDriver|new FileSystemDriver|new PDODriver); yapabilirsin.

    Security hep md5 mi olacak? Hayır.
    new Session(new RedisDriver|new FileSystemDriver|new PDODriver, new Cryptologer);
    Cryptologer içinde md5 harici, diğer kriptoloji methodlarına izin verebilirsin.

    gibi.

    Ayrıca, birden çok session driveri yazıyorsun. Neden bunları koleksiyona almıyorsun? Iterasyon kolay olur.

    Kod:
    SessionContainer::each(function($session) {
         $session->set('username', 'Aristona');
    });
    // Kaç tane farklı session olursa olsun, hepsine veriyi ekler.
    
    veya...

    Kod:
    SessionContainer::filter(function($session) {
         return $session->resources->used() > 32;
    })->each(function($session) {
         echo $session->id . ' driveri çok fazla ram kullanıyor.';
    });
    
    Saçma bir örnek oldu sanki ama olsun. :) Eğer birşeyden, birden fazla varsa ve bunları yönetmen gerekiyorsa, koleksiyon oluştur. Komplex birşey olmasına gerek yok. each(), map(), filter(), pop(), push() vb. fonksiyonalite olsa yetiyor. Bunu mesela Laravel çok iyi yapıyor. (diğer frameworkleri bilmiyorum.)

    Kod:
    $this->users->active = $users->filter(function($user) {
         return $user->platforms->filter(function($platform) {
             return $site->articles->filter(function($article) {
                   return $article->views > 0;
             });
          })->count() >= 1;
    })->count();
    
    
    Hop, extra sorgu yapmadan, kullanıcılardan, platformlarında herhangi bir articlenin görünüm sayısı 0'dan büyük olanların sayısını alabiliyorum. Başka biryerden gelen veriyle birleştirebiliyorum. each gibi methodları kullanmak istemezsen array fonksiyonlarını kullanabilirsin (zaten arkaplanda onlar kullanılıyor) ama böylesi daha hoş ve temiz oluyor. Illuminate\Support\Collection paketini kullanabilirsin kendi frameworkünde. Terminolojide (fonksiyonel programlama) bunların isimleri hep aynı zaten. map vb. İterasyon için https://github.com/nikic/iter paketini kullanabilirsin.

    Geliştirme olarak, DI konteynerine kendime lazım olan sınıfları bindlememe izin verebilirsin.

    Kod:
    $di->singleton('CDN', function() {
         return new Aristona\Classes\MaxCDN(
              \Config::get('cdn.credentials')
         );
    });
    $di->resolve('CDN')->purgeCache();
    
    Tabi bu da geliştirilir.

    Kod:
    $di->singleton('CDN', function() {
         return new Aristona\Classes\MaxCDN(
              \Config::get('cdn.credentials')
         );
    })->resolveWhen('CDNInterface');
    
    //BirseyController.php
    class BirseyController
    {
    
         public function __construct(CDNInterface $cdn)
         {
               $cdn->whoami(); // (object) Aristona/Classes/MaxCDN
         }
    
    }
    
    Reflection üzerinden sınıfları da otomatik enjekte edebilirsin. $di->resolve() ye gerek kalmadan. Dahası hayal gücün. PHP çekirdeği izin verdikçe bunlar da geliştirebilir.

    Bunu da geliştirirsin. CDN'ye zırt pırt bağlanmamak için BulkCommander adında bir paket geliştirebilirsin. Komutları paralelde işlemek için Paralel fonksiyonalitesini yazabilirsin. Curl vb. kullanan Connector sınıflarını yazabilirsin. Paralel işlemleri yapacak işlemi kuyruk olarak background processlere alabilrsin.

    3. $di=Smce\Core\DIInterface::resolve([COLOR=#DD0000][FONT=monospace]"di"[COLOR=#007700][FONT=monospace]);

    Errrm, bunu anlamadım. Interfacelerin amacı, implement ettiği sınıftaki methodları vb. olmasını şart koşmaktır. Mesela, sana bahsettiğim Session sınıfının driverleri, SessionInterface (hatta bunu da açabilirsin, StorableInterface, GettableInterface, IterableInterface gibi ama fazlası fazla oluyor) yi implemente etmeli. Yani tüm driverler aynı işi yapacağına söz vermeli. Hangisini kullanmak isterse son kullanıcı onu seçecek. Şöyle bir mantık kurduysan: "Bana, konteynerden DIInterfaceyi implement eden sınıfı ver.", o zaman biraz mantıklı olur.

    Aslında işin en güzel yanı ne biliyormusun, şuan senin yazdığın frameworkte kullanabileceğin binlerce paket var. Kendi session sınıfını yazmak yerine, yazılmış bir session paketini kullanıp onu frameworkün içinde çalıştırmak çok daha iyi oluyor.

    Şuan çekirdeğin eskisine göre daha iyi bir hale geliyor. Eğer sınıflarını fazla tight coupled tutmazsan, testlerini de yazarsın, taş gibi bir frameworkün olur. Gerisi QA ile ve diğer insanların yapacağı commitlerle gelir zaten. (Ha pek tutacağını sanmıyorum ama o benim karamsarlığım da olabilir, çünkü çok kaliteli ama tutmamış birçok framework gördüm githubda)

    Packagistten biraz daha paket eklersen: mesela intervention/image, whoops, monolog, symfont/console, symfony/process, symfony/event-dispatcher, flysystem, doctrine/cache, doctrine/annotations, nikic/iter, twig/twig, sebastion/comparator, faker, dotenv, debugbar vb. al sana full stack framework. Kurguyu düzgün yapıp lazy load ile yüklersen DI konteynerine classları (örn erişildiklerinde sınıflar oluşturulsun, önceden değil) performans sorunu da olmaz pek.

    Benden bu kadar, yazarken acıktım! ;D[/FONT][/COLOR][/FONT][/COLOR]
     
  18. ceida

    ceida Üye

    Kayıt:
    9 Ekim 2008
    Mesajlar:
    239
    Beğenilen Mesajlar:
    0
    Teşşekürler aristona hepsini değerlenidrecem. Gerçek çok iyi bilgiler veriyorsun. Biz bunlardan uzak yaşamışız Yii kullanıyordum. Yii kullanmamın tek nedeni crud ve widgetlerdi süper işe yarıyorlar şip şak bitiyor :D

    Şuan frameworkün güzelliği aslında nedir, sanki memchache gibi extension kurup,Mesala sadece DI ve EventManageri atıyorum Laravel projende kullanmak. İnclude derdi yok felan o yanı iyi :)

    Smce\Driver\Memcache , Smce\Driver\Redis

    PHP:

    $di
    =new Smce\Core\DI;

    $di->bind("memcache",function(){

        
    $mem=new Smce\Driver\Memcache;
        
    $mem->setConfig(array(
                
    "host"=>"127.0.0.1",
                
    "port"=>"11211"
            
    ));
        
    $mem->connect();

        return 
    $mem;
    });



    Smce\Core\DI::resolve("memcache")->set("key","Hello world!",false,300);

    echo 
    Smce\Core\DI::resolve("memcache")->get("key");





    $di=new Smce\Core\DI;

    $di->bind("redis",function(){

        
    $red=new Smce\Driver\Redis;
        
    $red->setConfig(array(
                
    "host"=>"127.0.0.1",
                
    "port"=>"6379"
            
    ));
        
    $red->connect();

        return 
    $red;
    });



    Smce\Core\DI::resolve("redis")->set("key","Hello world!",300);

    echo 
    Smce\Core\DI::resolve("redis")->get("key");
    Bişey soracam şimdi bunu nesneleri Session( ) içine gönderir sessionu bunda tutarız. Normal Session olayına ben SessionDriver mı ismini koymam gerek ?
    Birde setSecurity(md5("sda312737SAD2")) vardı bu birden fazla oturup yapmaya yarıyordu. Yani Keyleri crpt yapıyor get yaparkende ona göre çekiyordum. Ve birden fazla oturum olmus oluyor. adam oraya setSecurity(sha1(md5(sha1("sda312737SAD2")))) de yapabilir. Cryptologer yazarım onda sorun yok Sessiona onu enjekte nasıl edecez burada gerek varmı?
     
  19. Aristona

    Aristona Daimi Üye

    Kayıt:
    12 Eylül 2010
    Mesajlar:
    551
    Beğenilen Mesajlar:
    1
    Meslek:
    İşsiz
    Şehir:
    Narnia
    Farketmez, çok önemli değilse o halde tutabilirsin.
     
  20. ceida

    ceida Üye

    Kayıt:
    9 Ekim 2008
    Mesajlar:
    239
    Beğenilen Mesajlar:
    0
    Url

    PHP:
    $di=new Smce\Core\DI;


    $di->bind("url",function(){

         
    $url=new Smce\Mvc\Url;
         
    $url->setBaseUrl("/app");
         return 
    $url;

    });


    echo 
    Smce\Core\DI::resolve("url")->get("controller/action/13");    //  /app/controller/action/13
    --- Ekleme ---

    Collection


    PHP:
    <?php

    $di
    =new Smce\Core\DI;

    $di->bind("EventManager",function(){

        return new 
    Smce\Core\EventManager;

    });



    /*****************************************/


    $event=Smce\Core\DI::resolve("EventManager");


    $event->push("Container",function($arr){

        return new 
    Smce\Components\Collection($arr);

    });



    $arr=array(101266532);

    $container=Smce\Core\EventManager::getContainer($arr);

    echo 
    $container->filter(function($a){

        return 
    $a>12;

    })->
    count();  // 2

    Kod:
    
     public function each(<\Closure> callback)
    
    public function $fetch(string key)
    
    public function map(<\Closure> callback)
    
    public function filter(<\Closure> callback)
    
     public function pull(key, dt = null)
    
    public function pop()
    
     public function diff(array items)
    
     public function getAll() -> array
    
    public function first(<\Closure> callback = null, dt = null)
    
    public function flatten()
    
    public function get(key, dt = null)
    
    public function flip()
    
    public function has(key) -> bool
    
    public function isEmpty() -> bool
    
    public function keys()
    
    public function lists(string value, string key = null) -> array
    
    public function merge(array items)
    
    public function last()
    
    public function offsetExists(key) -> bool
    
    public function prepend(value)
    
    public function reduce(callback, initial = null)
    
    public function $reverse()
    
    public function search(value, bool strict = false)
    
    public function shift()
    
    public function sort(<\Closure> callback)
    
    public function splice(int offset, int length = 0, replacement = [])
    
    public function transform(<\Closure> callback)
    
     public function values()
    
     public function unique()
    
    public function shuffle()
    
    public function count() -> int
    
     public function push(value)
    
     public function offsetSet(key, value)
    
    
    --- Ekleme ---

    @Aristona


    Şu kısmı nasıl yapabilirim burada eksikliğim var. Örnek verebilirmisin. Güzel bir fikir.

    PHP:
    $di->singleton('CDN', function() {
         return new 
    Aristona\Classes\MaxCDN(
              \
    Config::get('cdn.credentials')
         );
    })->
    resolveWhen('CDNInterface');

    //BirseyController.php
    class BirseyController
    {

         public function 
    __construct(CDNInterface $cdn)
         {
               
    $cdn->whoami(); // (object) Aristona/Classes/MaxCDN
         
    }
    burada galiba sınıf dan yeni isimde sınıf türetilmiş.

    --- Ekleme ---

    CDNInterface burdaki isim farklıda olabilir sanırım. Anonymous Class gibi bişey oluyor sanırım bunu nasıl oluşturabilirimde. Controller içinde ; (orasına kafam yetmedi :D )

    public function __construct(CDNInterface $cdn)

    Bu şekilde alabilirim.

    --- Ekleme ---

    Response

    Smce\Http\Response
    Smce\Http\HttpException

    Throw ile fırlatıyoruz cachten alıyoruz. Listede hata kodları.

    PHP:

    <?php



    $di
    =new Smce\Core\EventManager;

    $di->push("response",function($code,$msg){

        throw new 
    Smce\Http\Response($code,$msg);

    });



    try{

        echo 
    "Foo";
        echo 
    "<br>";

        
    Smce\Core\EventManager::getResponse(404,"Not found");
        
    //Smce\Core\EventManager::getResponse(403,"Fobridden Msg....");

        
    echo "Zoo";

    }catch(
    Smce\Http\HttpException $e){


        echo 
    $e->getHttpCode(). " - ".$e->getMsg(); // 404 - Not found

    }



    /*


    100: "Continue"
    101: "Switching Protocols"
    200: "OK"
    201: "Created"
    202: "Accepted"
    203: "Non-Authoritative Information"
    204: "No Content"
    205: "Reset Content"
    206: "Partial Content"
    300: "Multiple Choices"
    301: "Moved Permanently"
    302: "Moved Temporarily"
    303: "See Other"
    304: "Not Modified"
    305: "Use Proxy"
    400: "Bad Request"
    401: "Unauthorized"
    402: "Payment Required"
    403: "Forbidden"
    404: "Not Found"
    405: "Method Not Allowed"
    406: "Not Acceptable"
    407: "Proxy Authentication Required"
    408: "Request Time-out"
    409: "Conflict"
    410: "Gone"
    411: "Length Required"
    412: "Precondition Failed"
    413: "Request Entity Too Large"
    414: "Request-URI Too Large"
    415: "Unsupported Media Type"
    500: "Internal Server Error"
    501: "Not Implemented"
    502: "Bad Gateway"
    503: "Service Unavailable"
    504: "Gateway Time-out"
    505: "HTTP Version not supported"

    */
    --- Ekleme ---

    Output

    PHP:
    $di=new Smce\Core\EventManager;

    $di->push("output",function($msg){

        
    $output= new Smce\Components\Output;

        
    $output ->setContentType("application/json")
                 
    //->setFileName("hello.json")
                   
    ->put(json_encode(array('message' => $msg)));

    });


    Smce\Core\EventManager::getOutput("Hello World");