İçeriğe atla

Symfony - 2. sayfa

Symfony RabbitMqBundle

Symfony de RabbitMQ Servsine php-amqplib kütüphanesi ile bağlantısını anlatacağım.

Rabbit bundle da Thumperin php-amqlib kütüphanesini kullanıyoruz.

Örnek:

$msg = array('user_id' => 1235, 'image_path' => '/path/to/new/pic.png');
$this->get('old_sound_rabbit_mq.upload_picture_producer')->publish(serialize($msg));

50 tane mesaj istegi oldugunda aşagıdaki komutu çalıştırın.

$ ./app/console rabbitmq:consumer -m 50 upload_picture

RabbitMq server kurulumunuzu yaptıktan sonra bundle kuruyoruz.
Kurulum
Composer ile kurun:

$ composer require php-amqplib/rabbitmq-bundle

Bunldle Kayıt edin:
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        new OldSound\RabbitMqBundle\OldSoundRabbitMqBundle(),
    );
}

Kurulum bitti şimdi ayarlarını yapmakta.

Composer da kalması gereken: (Lütfen silmeyin)

{
    "require": {
        "php-amqplib/rabbitmq-bundle": "~1.6",
    }
}

extension ve compiler ekleyin:

use OldSound\RabbitMqBundle\DependencyInjection\OldSoundRabbitMqExtension;
use OldSound\RabbitMqBundle\DependencyInjection\Compiler\RegisterPartsPass;

// ...

$containerBuilder->registerExtension(new OldSoundRabbitMqExtension());
$containerBuilder->addCompilerPass(new RegisterPartsPass());

Kullanım:

Confirasyon dosyanıza ekleyin:

old_sound_rabbit_mq:
    connections:
        default:
            host:     'localhost'
            port:     5672
            user:     'guest'
            password: 'guest'
            vhost:    '/'
            lazy:     false
            connection_timeout: 3
            read_write_timeout: 3

            # requires php-amqplib v2.4.1+ and PHP5.4+
            keepalive: false

            # requires php-amqplib v2.4.1+
            heartbeat: 0

            #requires php_sockets.dll
            use_socket: true # default false
        another:
            # A different (unused) connection defined by an URL. One can omit all parts,
            # except the scheme (amqp:). If both segment in the URL and a key value (see above)
            # are given the value from the URL takes precedence.
            # See https://www.rabbitmq.com/uri-spec.html on how to encode values.
            url: 'amqp://guest:password@localhost:5672/vhost?lazy=1&connection_timeout=6'
    producers:
        upload_picture:
            connection:       default
            exchange_options: {name: 'upload-picture', type: direct}
            service_alias:    my_app_service # no alias by default
    consumers:
        upload_picture:
            connection:       default
            exchange_options: {name: 'upload-picture', type: direct}
            queue_options:    {name: 'upload-picture'}
            callback:         upload_picture_service

old_sound_rabbit_mq.upload_picture_producerve old_sound_rabbit_mq.upload_picture_consumer. sonra kullanılmak üzere beklemede olan servisler. bu servisleri upload_picture_service ile cagırabilirsiniz.

İsteğe Bağlı Kuyruk İşlemleri:

queue_options: {name: 'upload-picture', arguments: {'x-ha-policy': ['S', 'all']}}

20 saniyelik TTL mesajı örnegi

queue_options: {name: 'upload-picture', arguments: {'x-message-ttl': ['I', 20000]}}

Değişken Türleri:

    S – String
    I – Integer
    D – Decimal
    T – Timestamps
    F – Table
    A – Array

arguments isteğinize göre düzenleyebilirsiniz.

Belirli koşullara göre yaptırmak isterseniz:

queue_options:
    name: "upload-picture"
    routing_keys:
      - 'android.#.upload'
      - 'iphone.upload'

Önemli Uyarı:
2.3 üstü için geçerlidir bu yazılar eski versiyonlarda çalışmaz.

RabbitMQ server bağlantı ayarları:

connections:
    default:
        host:     'localhost'
        port:     5672
        user:     'guest'
        password: 'guest'
        vhost:    'foo' # to be dynamically overridden by <code>connection_parameters_provider</code>
        connection_parameters_provider: connection_parameters_provider_service

Örnek Uygulama:

class ConnectionParametersProviderService implements ConnectionParametersProvider {
    ...
    public function getConnectionParameters() {
        return array('vhost' => $this->getVhost());
    }
    ...
}

Producers, Consumers, Nedir?

Producers:
Gönderme sürecinde yapılan işlemlere denir.

Consumers:
Gönderilen verileri alıp işleyen birime denir.

Yüklenen resmi arkaplanda işlem yaptırmak istediğinizi varsayarsak:

public function indexAction($name)
{
    $msg = array('user_id' => 1235, 'image_path' => '/path/to/new/pic.png');
    $this->get('old_sound_rabbit_mq.upload_picture_producer')->publish(serialize($msg));
}

Producers burada upload_picture

Servis burada old_sound_rabbit_mq.upload_picture_producer

setContentType ve setDeliveryMode yöntemlerini kullanabilirsiniz.

$this->get('old_sound_rabbit_mq.upload_picture_producer')->setContentType('application/json');

OldSound\RabbitMqBundle\RabbitMq\Producer dan miras alarak aşagıdaki classı kullanabilirsiniz.

 ...
    producers:
        upload_picture:
            class: My\Custom\Producer
            connection: default
            exchange_options: {name: 'upload-picture', type: direct}
    ...

Bundan sonraki işlemlde artık Consumers kısmına geçtik.
Burada iletilere göre işlemlere başlayacaktır.

consumers:
    upload_picture:
        connection:       default
        exchange_options: {name: 'upload-picture', type: direct}
        queue_options:    {name: 'upload-picture'}
        callback:         upload_picture_service

Görüldügü gibi callback bölümü mevcuttur işlemler bittiginde callback ile dönüş yapacaktır.

customer çalıştıgına emin olabilmeniz için aşagıdaki kodu çalıştırabilirsiniz:

$ ./app/console rabbitmq:consumer -m 50 upload_picture
$ ./app/console rabbitmq:consumer -w upload_picture

Bu işlemleri yapabilmeniz için PCNTL kütüphanesine ihtiyacınız vardır.

256 MB bellek sınırı vermek için:

$ ./app/console rabbitmq: consumer -l 256

Sıraya alınan bütün iletileri simek için

$ ./app/console rabbitmq: tasfiye - no-confirmation upload_picture

Tüketici kuyrugunu silmek için:

$ ./app/console rabbitmq: delete --no-onayı upload_picture

Symfony Manytomany kullanımı

Symfony Manytomany kullanımı

1. entity e yazacagımız:

    /**
     * @ORM\ManyToMany(targetEntity="RtStokKategori", mappedBy="RtMenu")
     */
    public $RtStokKategori;

2. entity e yazacagımız:

    /**
     * @ORM\ManyToMany(targetEntity="RtMenu", inversedBy="RtStokKategori")
     * @ORM\JoinTable(name="rt_menu_ve_kategori")
     */
    public $RtMenu;

Veritabanını Güncelliyelim

php bin/console doctrine:schema:update --force

Symfony FosUserBundle Kullanımı

Symfony FosUserBundle Kullanımı

Konsolda yapılan işlemlerdir.

Kullanıcı adı ve şifre tanımlama:

php bin/console fos:user:create kullanici kullanici@tasarimrehberi.net sifre

Süper Admin Yapma:
php bin/console fos:user:create kullanici –super-admin[/php]

Kullanıcı Pasifleştirme:

php bin/console fos:user:create kullanici --inactive

Kullanıcı Aktifleştirme:

php bin/console fos:user:activate kullanici

Kullanıcıya admin hakkı tanıma:

php bin/console fos:user:promote kullanici ROLE_ADMIN

Kullanıcıya süper admin tanıma:

php bin/console fos:user:promote kullanici --super

Şifre Değiştirme:

php bin/console fos:user:change-password kullanici sifre

Symfony de url gösterme

Eğer symfony ve twig kullanıyorsanız link göstermek isterseniz aşagıdakileri yapmanız yeterlidir.

Kontroller dosyasında aşagıdaki gibi yazın.

        $cari_url = $this->generateUrl('fatura_show',array('id'=>$fatura->getId()));
        $cari_url = '<a href="'.$cari_url.'">Fatura</a>';

twig dosyasına alttakine yazmanız yeterli.

{{ cari_url|raw }}

Symfony: Textfielde yazılan veri varmı

Bu yazıda symfony de text field e veri yazarken o veri daha önce eklenmiş onu kontrol etmenizi sağlayan eklentiyi paylaşıyorum.

İşlem yapacagınız bölümler:

  • Routing
  • Conroller
  • Views

bu üç dosyada işlem yapacaksınız.

Öncelikle controller oluşturmanız gerekiyor. ismi AjaxController.php olsun içeriği

<?php namespace Web\AdminBundle\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; /** * Ajax controller. * */ class AjaxController extends Controller { public function otel_kontrolAction(Request $request) { $em = $this->getDoctrine()->getManager();
        $otel_ad = $request->get('kayitli');
        $otel = $em->getRepository("WebAdminBundle:Otel")->findOneBy(array('ad'=>$otel_ad));
        $sonuc = array();
        if($otel)
        {
            $otel_url = $this->generateUrl('otel_show',array('id'=>$otel->getId()));
            $sonuc['durum'] = 0;
            $sonuc['html'] = 'Kayitli Otel gitmek için <a href="'.$otel_url.'">tıklayınız</a>';
        }
        else
        {
            $sonuc['durum'] = 1;
            $sonuc['html'] = '';
        }
        return new Response(json_encode($sonuc));

    }

}


Sonrasında routing dosyası oluşturalım ismi ajax.yml olsun.

ajax_otelkontrol:
    path:     /otelkontrol
    defaults: { _controller: "WebAdminBundle:Ajax:otel_kontrol" }

Routing.yml dosyasına girelim. aşagıdaki kodu ekliyelim.

web_admin_ajax:
    resource: "@WebAdminBundle/Resources/config/routing/ajax.yml"
    prefix:   /ajax

Sonrasında ilgili tiwg dosyasına gidiyoruz.

{{ form_start(form) }}

hemen altına

{{ form_row(form.ad) }}
                            <div id="sonuc"></div>

burada form.ad kendinize göre yani aratacagınzı veriye göre düzenlemeniz gerekiyor.

endblock altına girip.

{% block script %}
     <script>
        $(document).ready(function () {
            $('#web_adminbundle_otel_faturaNumarasi').keyup(function () {
                fatura_kontrol($(this).val());
            });
            $('#web_adminbundle_otel_ad').focusout(function () {
                fatura_kontrol($(this).val());
            });
            $('#web_adminbundle_otel_ad').change(function () {
                fatura_kontrol($(this).val());
            });
        });
        function fatura_kontrol(deger) {
            veriler = 'kayitli='+deger;
            $.post('{{ path('ajax_otelkontrol') }}',veriler,function (sonuc) {
                $('#sonuc').html(sonuc.html);

            },'json');
        }
    </script>
{% endblock %}

kodunu ekliyorsunuz web_adminbundle_otel_ad kısmını oradaki verinize göre çekiyorsunuz.

İlgili Dosyaları indir:
http://www.tasarimrehberi.net/download/217/

Birden Fazla Tabloda __tostring kullanımı

Farklı Baglantılarda değişken getirmek.

Birden fazla tablonuz olduğunuzu varsayalım

cari
fatura
fatura_vade

fatura_vade de fatura vade eklemye kalktıgınızda to string hatası verecektir.
Bu durumda eğer cari adını ve fatura tarihini görmek isterseniz.

Fatura bölümüne aşagıdaki kodu yazmanız yeterlidir.

    public function __toString()
    {
        return $this->getCari()->__toString().' '.date("d-m-Y",$this->getTarih());
    }

http://www.tasarimrehberi.net/download/207/

Symfony Tarih ve saat ekleme

Symfony Tarih ve saat ekleme

Öncelikle base.html.twig dosyasına aşagıdaki kodu ekleyin

    <script>
        $(document).ready(function () {
            $('.form_timepicker').datetimepicker({
                format:"hh:ii",
                startView: 1
            });

            $(".form_datetime2").datepicker({
                dateFormat:"dd.mm.yy",
                monthNames: [ "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık" ],
                monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],
                dayNamesMin: [ "Pa", "Pt", "Sl", "Ça", "Pe", "Cu", "Ct" ],
                changeMonth: true,
                changeYear: true
            });
        });
    </script>

ilgili bölümün type kısmına girin.
tarih kısmı için
form_datetime2

saat kısmı için
form_timepicker
kullanıın

        $builder->add('tarih', TextType::class   , array('label'=>'Tarih','attr'=>array('class'=>'form-control form_datetime2'))
)->add('saat', null, array('label'=>'Saat','attr'=>array('class'=>'form-control form_timepicker'))

Kontroller dosyasına girip hangi bölüme eklemek istiyorsanız o bölüme aşagıdakini yazın. Örnegin new yapacaksanız.
Değişken tanımlama bölümüne aşagıdakileri yazın.

        $tarih = date("d.m.Y");
        $saat = date("H:i");

eğer tablonuzu integer yaptıysanız

 if ($form->isSubmitted() && $form->isValid()) {

altına ekleyiniz.
$Fatura->setTarih(strtotime($form['tarih']->getData())) ;

sonrasında twig dosyasına göndermek için aşagıdaki gibi sistemi uygulayın.

        return $this->render('WebAdminBundle:fatura:new.html.twig', array(
            'Fatura' => $Fatura,
            'form'           => $form->createView(),
            'hata'           => $hata,
            'hatakodu'       => $hatakodu,
            'tarih'       => $tarih,
            'saat'       => $saat,
        ));
    }

new.html.twig dosyasına gelip

aşagakidaki gibi düzenleyin.

                            {{ form_start(form) }}
                            {{ form_row(form.tarih,{'value': tarih }) }}
                            {{ form_row(form.saat,{'value': saat }) }}
                            {{ form_widget(form) }}

buradaki form_start ve form_widget arasına yazmalısınız.

Ekranda göstermek istediğinizde kontrolerin show bölümünde

    public function showAction(Fatura $Fatura)
    {
        $deleteForm = $this->createDeleteForm($Fatura);
        $tarih = $Fatura->getTarih();
        $tarih = date("d.m.Y",$tarih);
        return $this->render('WebAdminBundle:fatura:show.html.twig', array(
            'Fatura' => $Fatura,
            'tarih' => $tarih,
            'delete_form' => $deleteForm->createView(),
        ));
    }

şeklinde düzenleyin.

show.html.twig dosyasını açın.

{{ Fatura.tarih }}

olan ismi

{{ tarih }}

şeklinde değiştirin.

Düzenleme bölümünü yapmak için.
edit action bölümünü açın.

        $tarih = $Fatura->getTarih();
        $tarih = date("d.m.Y",$tarih);

        return $this->render('WebAdminBundle:fatura:edit.html.twig', array(
            'Fatura' => $Fatura,
            'tarih' => $tarih,
            'edit_form'      => $editForm->createView(),
            'delete_form'    => $deleteForm->createView(),
            'hata'           => $hata,
            'hatakodu'       => $hatakodu,
        ));

şeklinde ekleyin.

edit.twig.html acın


                            {{ form_start(edit_form) }}
                            {{ form_row(edit_form.tarih,{'value': tarih }) }}
                            {{ form_widget(edit_form) }}

şeklinde düzenleyin.

kontroller kısmında edit actionda aşagıdaki kodu bulun

if ($editForm->isSubmitted() && $editForm->isValid()) {

altına ekle

 $Fatura->setTarih(strtotime($editForm['tarih']->getData())) ;

İndirme Linki:

http://www.tasarimrehberi.net/download/201/