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. Aristona

    Aristona Daimi Üye

    Kayıt:
    12 Eylül 2010
    Mesajlar:
    551
    Beğenilen Mesajlar:
    1
    Meslek:
    İşsiz
    Şehir:
    Narnia
    ReflectionClass ile oluşturulacak sınıfa bakıp, constructor parametrelerini alıp hangi parametreler istenmişse ona göre enjeksiyon yapabilirsin.

    http://stackoverflow.com/questions/...-type-of-constructor-parameter-via-reflection

    Yani
    new Controller(DI::resolve($reflection->constructorParametresi()); gibi birşey olmalı.

    Yukarıdaki örnekte verdiğim resolvesWhen methodu da (aslında başka birşeyde olabilir, şunu bilgiyi tutacak)

    XInterface => return new X; //XInterface görürsen return new X ver. Bunu arrayda falan biryerde tutarsın.

    Yani

    new Controller(DI::resolve('XInterface')); haline gelecek. (Reflectiondan XInterface bilgisi gelmiş olacak)

    DI konteynerin, XInterface istenmiş, o zaman new X vereyim diyecek. (Çünkü XInterface gördüğün yere return new X ver dedik, resolvesWhen methodu ile eklersin. Veya başka türlü eklersin, resolvesWhen methodu şart değil. $di->bindInterface falan da diyebilirsin orası farketmez.

    Sonuç olarak, new Controller(new X()); haline gelecek sınıf. Mantık böyle. MethodReflection falan da var, eğer methodlara da enjeksiyon yapmak istersen.

    Laravel 5 bunu yapmaya başladı mesela. (Daha denemeye vaktim olmadı) Methodlara Request objesi bindleniyor formdan gelen. Sen de şöyle birşey yapabilirsin istersen:

    Kod:
    public function create(FormRequest $form)
    {
         $form->validates(function($form) {
              \User::insert($form->toArray());
         });
    }
    
    ;

    gibi birşey.

    Reflectionlar biraz costy (performans takıntın var galiba) ama aşırı kullanmadıktan sonra sorun yok. Bu tür kolaylıkları sağlamak için şart ama. :)

    --- Ekleme ---

    ReflectionClass ile oluşturulacak sınıfa bakıp, constructor parametrelerini alıp hangi parametreler istenmişse ona göre enjeksiyon yapabilirsin.

    http://stackoverflow.com/questions/4262350/how-do-i-get-the-type-of-constructor-parameter-via-reflection

    Yani
    new Controller(DI::resolve($reflection->constructorParametresi()); gibi birşey olmalı.

    Yukarıdaki örnekte verdiğim resolvesWhen methodu da (aslında başka birşeyde olabilir, şunu bilgiyi tutacak)

    XInterface => return new X; //XInterface görürsen return new X ver. Bunu arrayda falan biryerde tutarsın.

    Yani

    new Controller(DI::resolve('XInterface')); haline gelecek. (Reflectiondan XInterface bilgisi gelmiş olacak)

    DI konteynerin, XInterface istenmiş, o zaman new X vereyim diyecek. (Çünkü XInterface gördüğün yere return new X ver dedik, resolvesWhen methodu ile eklersin. Veya başka türlü eklersin, resolvesWhen methodu şart değil. $di->bindInterface falan da diyebilirsin orası farketmez.

    Sonuç olarak, new Controller(new X()); haline gelecek sınıf. Mantık böyle. MethodReflection falan da var, eğer methodlara da enjeksiyon yapmak istersen.

    Laravel 5 bunu yapmaya başladı mesela. (Daha denemeye vaktim olmadı) Methodlara Request objesi bindleniyor formdan gelen. Sen de şöyle birşey yapabilirsin istersen:

    Kod:
    public function create(FormRequest $form)
    {
         $form->validates(function($form) {
              \User::insert($form->toArray());
         });
    }
    
    ;

    gibi birşey.

    Reflectionlar biraz costy (performans takıntın var galiba) ama aşırı kullanmadıktan sonra sorun yok. Bu tür kolaylıkları sağlamak için şart ama. :)
     
  2. ceida

    ceida Üye

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

    --- Ekleme ---

    Kod:
    Catchable fatal error: Argument 1 passed to  SiteController::__construct() must be an instance of PersonInterface,  instance of Person
    Şöyle bir hata aldık. İçeriye gönderdiğim Person sınıfı. Ben onu PersonInterface ile almaya çalışıyorum

    PHP:
    $di->singleton("person",function(){

        return new 
    Person;

    })->
    resolveWhen("PersonInterface");
    PHP:
    public function __construct(PersonInterface $person)
    --- Ekleme ---

    Şöyle bişey yaparsak çalışıyor.

    index.php
    PHP:


    $di
    ->singleton("person",function(){

        return new 
    Person;

    })->
    resolveWhen("Person");


    Conroller
    PHP:


    class SiteController
    {
        
        public function 
    __construct(Person $person)
        {
            echo 
    $person->getName();

        }

        public function 
    actionIndex()
        {

            echo 
    "Hello world";

        }


    }
    Model

    PHP:
    <?php


    class Person
    {
        
        public function 
    getName()
        {

            return 
    "Foo";

        }


        public function 
    getSurname()
        {

            return 
    "Soo";

        }
        
    }


    --- Ekleme ---

    Yaptım çalıştı class_alias() işimi gördü :))

    PHP:
    $di->singleton("person",function(){

        return new 
    Person;

    })->
    resolveWhen("PersonInterface");

    PHP:
    class SiteController
    {
        
        public function 
    __construct(PersonInterface $person)
        {
            echo 
    $person->getName();

        }

        public function 
    actionIndex()
        {

            echo 
    "Hello world";

        }


    }

    Geliştirecem Söyle bişey yapmam gerek.

    newInstanceArgs ile array olarak public function __construc veri gönderebiliyorum. Ben bunu söyle yapacam.

    PHP:
    public function __construct(PersonInterface $personBrandInterface $brandNewsInterface $news ......)
    --- Ekleme ---

    Çalışıyor :))

    PHP:
    $di->singleton("company",function(){

        return new 
    Company;

    })->
    resolveWhen("CurrentCompany");

    $di->singleton("person",function(){

        return new 
    Person;

    })->
    resolveWhen("PersonInterface");


    $di->singleton("brand",function(){

        return new 
    Brand;

    })->
    resolveWhen("CompanyBrand");

    PHP:

    class SiteController
    {
        
        public function 
    __construct(PersonInterface $personCurrentCompany $company)
        {
            echo 
    $company->getCompanyName();

            echo 
    "<br>";

            echo 
    $person->getPersonName()." ".$person->getPersonSurname();

             echo 
    "<br>";

        }

        public function 
    actionIndex(CompanyBrand $brand)
        {

            echo 
    "<br>";
            echo 
    $brand->getBrandName();

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

            
    $di=Smce\Core\DI::resolve("brand");
            echo 
    $di->getBrandName();
        }


    }
    --- Ekleme ---

    Method invokeArgs()

    ile action İçlerine multi class gönderilme yapıldı.

    Son durum söyle

    PHP:
    public function __construct(PersonInterface $personCurrentCompany $company)
    PHP:
    public function actionIndex(CompanyBrand $brandPersonInterface $person)
    --- Ekleme ---

    Aristona

    Di ve CACHE nasıl olur :)

    Non-CACHE

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


     
    if(
    Smce\Core\DI::has("pdt")==false) {

        
    $di->bind("pdt",function(){
             
    $a=1;
            for(
    $i=0;$i<100000;$i++){
                
    $a++;
            }  
             
    $person=new Person;
             
    $person->set($a);

            
            return 
    $person;

        });





    $person=Smce\Core\DI::resolve("pdt");

    echo 
    $person->getPersonName();



    Cache

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

    $di=new Smce\Core\DI($memcache);



     
    if(
    Smce\Core\DI::has("pdt")==false) {

        
    $di->bind("pdt",function(){
             
    $a=1;
            for(
    $i=0;$i<100000;$i++){
                
    $a++;
            }  
             
    $person=new Person;
             
    $person->set($a);

            
            return 
    $person;

        })->
    cache(3000);





    $person=Smce\Core\DI::resolve("pdt");

    echo 
    $person->getPersonName();


    NonCache

    Kod:
    ab -n 2000 -c 10 http://localhost/smceframework2/examples/components/dicache/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:          /smceframework2/examples/components/dicache/index.php
    Document Length:        6 bytes
    
    Concurrency Level:      10
    Time taken for tests:   11.042 seconds
    Complete requests:      2000
    Failed requests:        0
    Total transferred:      384000 bytes
    HTML transferred:       12000 bytes
    Requests per second:    181.13 [#/sec] (mean)
    Time per request:       55.209 [ms] (mean)
    Time per request:       5.521 [ms] (mean, across all concurrent requests)
    Transfer rate:          33.96 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   0.0      0       0
    Processing:    18   55  25.5     51     197
    Waiting:       18   55  25.4     51     197
    Total:         18   55  25.5     51     197
    
    Percentage of the requests served within a certain time (ms)
      50%     51
      66%     62
      75%     69
      80%     74
      90%     88
      95%    103
      98%    120
      99%    139
     100%    197 (longest request)
    
    

    CACHe

    Kod:
    ab -n 2000 -c 10 http://localhost/smceframework2/examples/components/dicache/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:          /smceframework2/examples/components/dicache/index.php
    Document Length:        6 bytes
    
    Concurrency Level:      10
    Time taken for tests:   0.832 seconds
    Complete requests:      2000
    Failed requests:        0
    Total transferred:      384000 bytes
    HTML transferred:       12000 bytes
    Requests per second:    2403.27 [#/sec] (mean)
    Time per request:       4.161 [ms] (mean)
    Time per request:       0.416 [ms] (mean, across all concurrent requests)
    Transfer rate:          450.61 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   0.2      0       4
    Processing:     1    4   5.3      3      81
    Waiting:        1    4   5.3      3      81
    Total:          1    4   5.4      3      81
    
    Percentage of the requests served within a certain time (ms)
      50%      3
      66%      4
      75%      5
      80%      6
      90%      7
      95%      9
      98%     11
      99%     14
     100%     81 (longest request)
    
    
    --- Ekleme ---

    Burdan indirilebilir - Şuan Projelerde kullanabilir %100 C

    https://github.com/smceframework2



    Kurulumu

    Kod:
    
    $ cd cframework
    
    $ sudo apt-get install php5-dev libpcre3-dev gcc make
    
    $ ./install 
    
    php.ini bunu ekleyin.
    
    extension=smce.so
    
    $ service apache2 restart
    
    
    --- Ekleme ---

    API - Dökümantasyon oluşturuldu

    https://github.com/smceframework2/API


    [​IMG]
     
  3. ceida

    ceida Üye

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

    Testlerin bir kısmı yazıldı. Şöyle bir sıkıntım var.

    Kod:
    phpunit --configuration phpunit.xml --process-isolation
    bunu localde çalıştırdığım zaman

    Kod:
    Loader2::test1
    PHPUnit_Framework_Exception: PHP Fatal error:  Class 'Smce\Core\DI' not found in
    Böyle absürük bi mesaj alıyorum. Localde çalıştıramadım. Phpunitin bir ayarımı var nedir anlayamadım. Extend görmüyor.



    Travis.ci de ise çalışıyor.

    Kod:
    \Smce\Core\DI
    Böyle yapıyorum yine çalışmıyor. yukarıda use olarak tanımlıyorum yine görmüyor localde. Examples çalışıyor ama.


    --- Ekleme ---

    Aristona tekrar tekrar teşşekürler bayağı ilerledik :) büyük adamsın yazılımda

    --- Ekleme ---

    Aristona tekrar tekrar teşşekürler bayağı ilerledik :) büyük adamsın yazılımda
     
  4. ceida

    ceida Üye

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

    Kısayoldan ayarlamaları kontrol edebiliriz.

    PHP:
    <?php


    use Smce\Core\EventManager;
    use 
    Smce\Sm;

    $event=new EventManager;


    $event->bind("config",function(){
        return array(
                
    "db"=>array(
                    
    "db_user"         => 'root',
                    
    "db_password"     => '123456',
                    
    "db_dbname"     => 'dbname',
                    
    "db_host"        => 'localhost',
                    
    "db_encoding"     => 'utf8',
                ),

                
    "baseurl"=>dirname(__FILE__),

                
    "data1"=>"Hello",

            );
        
    });

    echo 
    "<br>";

    echo 
    Sm::app()->baseurl;

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

    echo 
    Sm::app()->data1;

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

    echo 
    Sm::app()->db["db_user"];
    echo 
    "<br>";
    echo 
    Sm::app()->db["db_password"];
    echo 
    "<br>";
    echo 
    Sm::app()->db["db_dbname"];
    echo 
    "<br>";
    echo 
    Sm::app()->db["db_host"];
    echo 
    "<br>";
    echo 
    Sm::app()->db["db_encoding"];
    --- Ekleme ---

    Template - Layout - MasterPage

    controller

    PHP:
    <?php

    use Smce\Core\DI;

    class 
    SiteController
    {


        public function 
    __construct()
        {

            
    $this->setTemplate();
            
    $this->setContent();

        }

        private function 
    setTemplate()
        {

            
    DI::bind("template",function(){
                
    $template = new Smce\Mvc\Template;
                
    $template->setLayoutDirectory(dirname(__FILE__)."/../view/layouts");
                
    $template->setViewDirectory(dirname(__FILE__)."/../view");
                
    $template->setLayout("column1");
                return 
    $template;
            });


        }

        private function 
    render($view$arr=array())
        {

            
    $template=DI::resolve("template");
            
    $template->setView($view$arr);
            
    $template->run();

        }

        private function 
    setContent()
        {

            
    DI::bind("layout",function(){
                
    $layout = new Smce\Mvc\Layout;
                
    $layout->setContentDirectory(dirname(__FILE__)."/../view/layouts");
                return 
    $layout;
            });
        
        }

        public static function 
    renderContent($view$arr=array())
        {

            
    $layout=DI::resolve("layout");
            
    $layout->setContent($view$arr);
            
    $layout->run();

        }




        
    // http://localhost/helloworld/index.php?route=/site/index

        
    public function actionIndex()
        {

            
    $msg="Hello World";

            
    $this->render("site/index",array(
                
    "msg"=>$msg,
            ));

        }


    }
    layout - column1

    PHP:
    <?php SiteController::renderContent("header"); ?>

    <div id="content">

        <?php echo $content;?>

    </div><!-- content -->

    <?php SiteController::renderContent("footer"); ?>

    layout - header

    PHP:
    <?php /* @var $this Controller */ ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Welcome to SF2</title>

        <style type="text/css">

        body {
            background-color: #fff;
            margin: 40px;
            font-family:Helvetica, Arial, sans-serif;;
            color: #4F5155;
        }
        .footer{
            text-align:center;
            font-size:10px;
            margin: 20px 0 0 0;
        }
        
        .content{
            margin: 10px;
            border: 1px solid #E1DFDF;
            padding:30px 30px 30px 30px;
            background-color:#EFEFEF;
            border-radius:5px;
        }
        </style>
    </head>
    <body>

    <div id="container">
        <h1>Welcome to SF2.</h1>
        
        <div class="content">
            


    layout - footer


    PHP:
    </div>

        <div class="footer"> Copyright © <?php echo date("Y")?> by SmceFramework2 - SF2. </div>
    </div>

    </body>
    </html>
    view - site/index

    PHP:
    <?php

    echo $msg;

    ?>
    --- Ekleme ---

    Queue

    Kuyruklamalarımızı bi model class yapısıyla, "fire( )" fonksyionu yazıp fırlatıyoruz. Bunların hepsi Examples içinde yer alıyor. Prjenin API içinde kullanabilecek fonksiyonlara ulaşabiliriz. Bazıları aşağıda:

    model

    PHP:
    <?php


    class Foo
    {

        public 
    $name;

        public function 
    fire()
        {

            echo 
    "Hello ".$this->name;
            
    //exit;

        
    }

    }

    bind.php


    PHP:
    <?php


    use Smce\Core\DI;
    use 
    Smce\Core\Loader;
    use 
    Smce\Core\Queue;

    $di=new DI;


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

        
    $loader=new Loader;

        
    $loader->setDir(array(
            
    dirname(__FILE__)."/queuemodel/",
        ));

        return 
    $loader;
    });

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

    $di->bind("memcache",function(){
            
    $memcache=new Smce\Driver\Memcache;
            
    $memcache->setConfig(array(
                
    "host"=>"127.0.0.1",
                
    "port"=>"11211"
            
    ));
            
    $memcache->connect();
            return 
    $memcache;

        });

    $queue=new Queue(DI::resolve("memcache"));

    //bind register

    $queue->bind("queue1","process1",function(){
                                
        
    $foo=new Foo;
        
    $foo->name="Soo";
        return 
    $foo;

    })->
    register(Queue::MAX);

    //addMinutes - After 10 min

    /*
    $queue->bind("queue1","process1",function(){
                                
        $foo=new Foo;
        $foo->name="Soo";
        return $foo;

    })->addMinutes(10)->register(Queue::MAX);

     */
    start

    PHP:
    <?php

    use Smce\Core\DI;
    use 
    Smce\Core\Loader;
    use 
    Smce\Core\Queue\QueueListen;

    $di=new DI;

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

        
    $loader=new Loader;

        
    $loader->setDir(array(
            
    dirname(__FILE__)."/queuemodel/",
        ));

        return 
    $loader;
    });

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

    $di->bind("memcache",function(){
            
    $memcache=new Smce\Driver\Memcache;
            
    $memcache->setConfig(array(
                
    "host"=>"127.0.0.1",
                
    "port"=>"11211"
            
    ));
            
    $memcache->connect();
            return 
    $memcache;

        });

    //new Queue
    $listen=new QueueListen(DI::resolve("memcache"),"queue1");

    //Queue start
    $listen->start();

    status

    PHP:
    <?php

    use Smce\Core\DI;
    use 
    Smce\Core\Queue\QueueListen;

    $di=new DI;

    $di->bind("memcache",function(){
            
    $memcache=new Smce\Driver\Memcache;
            
    $memcache->setConfig(array(
                
    "host"=>"127.0.0.1",
                
    "port"=>"11211"
            
    ));
            
    $memcache->connect();
            return 
    $memcache;

        });

    //new Queue
    $listen=new QueueListen(DI::resolve("memcache"),"queue1");


    echo 
    json_encode($listen->status());
    echo 
    "<br>";
    echo 
    "<br>";

    if(!empty(
    $listen->getLastTransactionTime()))
    {

        echo 
    "Process Time:"date("Y-m-d H:i:s",$listen->getLastTransactionTime());
    }

    echo 
    "<br>";
    echo 
    "<br>";
    echo 
    "<pre>";
    print_r($listen->getAll());

    stop

    PHP:
    <?php

    use Smce\Core\DI;
    use 
    Smce\Core\Queue\QueueListen;

    $di=new DI;

    $di->bind("memcache",function(){
            
    $memcache=new Smce\Driver\Memcache;
            
    $memcache->setConfig(array(
                
    "host"=>"127.0.0.1",
                
    "port"=>"11211"
            
    ));
            
    $memcache->connect();
            return 
    $memcache;

        });

    //new Queue
    $listen=new QueueListen($di->resolve("memcache"),"queue1");


    //Queue stop
    $listen->stop();

    sleep

    PHP:
    <?php

    use Smce\Core\DI;
    use 
    Smce\Core\Queue\QueueListen;

    $di=new DI;

    DI::bind("memcache",function(){
            
    $memcache=new Smce\Driver\Memcache;
            
    $memcache->setConfig(array(
                
    "host"=>"127.0.0.1",
                
    "port"=>"11211"
            
    ));
            
    $memcache->connect();
            return 
    $memcache;

        });

    //new Queue
    $listen=new QueueListen(DI::resolve("memcache"),"queue1");


    //Queue sleep
    $listen->sleep(60*15);
    deleteAll
    PHP:
    <?php


    use Smce\Core\DI;
    use 
    Smce\Core\Queue;

    $di=new DI;

    $di->bind("memcache",function(){
            
    $memcache=new Smce\Driver\Memcache;
            
    $memcache->setConfig(array(
                
    "host"=>"127.0.0.1",
                
    "port"=>"11211"
            
    ));
            
    $memcache->connect();
            return 
    $memcache;

        });

    $queue=new Queue(DI::resolve("memcache"));

    $queue->removeQue("queue1");
    --- Ekleme ---

    delete

    PHP:
    <?php


    use Smce\Core\DI;
    use 
    Smce\Core\Queue;

    $di=new DI;

    $di->bind("memcache",function(){
            
    $memcache=new Smce\Driver\Memcache;
            
    $memcache->setConfig(array(
                
    "host"=>"127.0.0.1",
                
    "port"=>"11211"
            
    ));
            
    $memcache->connect();
            return 
    $memcache;

        });

    $queue=new Queue(DI::resolve("memcache"));

    $queue->remove("queue1","process1");