Symfony Model Callback Eşdeğer

3 Cevap php

Benim Widget sınıfından, bir Page ait widget bir dizi almak zorunda nerede Symfony proje üzerinde (benim ilk) çalışıyorum. Harici bir hizmet karşı - - kullanıcı her widget görüntülemek için yetkili olduğunu sonuçları dönmeden önce olsa, ben doğrulamak gerekir. Eğer değilse, tabii ki, ben sonuç kümesinden aracını kaldırmak gerekir.

CakePHP'ye veya Rails kullanarak, ben geri aramaları kullanmak istiyorum, ama Symfony için benzer bir şey bulamadı. (Tartışma her zaman için olduğu) I events görüyorum, ama doğru şeyler okuyorum eğer bu kontrolörleri / eylemler için daha uygun görünüyor. Benim dönüş çözüm, WidgetPeer sınıfında çeşitli alma yöntemlerini geçersiz yetkilendirme yapar ve uygun şekilde ayarlanır sonucu değiştiren özel bir yöntemle bunları değiştirmektir. Ben bu yetkilendirme bunun hakkında düşünmek zorunda gelecekteki geliştiriciler olmadan yapıldı sağlamak için every seçim yöntemini geçersiz olurdu yana olsa da, masif overkill gibi hissediyor.

Davranışlar (ben gelecekte diğer sınıf örneklerini yetki gerekebilir conceivable o yana özellikle) bunun için yararlı olabilir, ama nitelikli bir değerlendirme yapmak için onlara herhangi bir iyi belgelerine bulamıyor gibi görünüyor .

Ben bir şey eksik? Daha iyi bir yolu olmalı gibi görünüyor, ama ben bulamadım.

3 Cevap

En azından teoride, ben hala bir davranış doğru bir yaklaşım olduğunu düşünüyorum rağmen, bana bir sıcak ve bulanık o olmadan gerçekleştirilebileceğini vermek için Symfony 1.4.x bunların uygulanması ile ilgili belgeleri yeterli düzeyde bulamıyorum mide ekşimesi çok, hiç değilse. Hatta davranışları için itmek kendi belgelerine bakarak, ben almak gerekir eylemi tetiklemek için hiçbir ön-veya post-alma kanca görebilirsiniz.

Sonuç olarak, benim geri dönüş yolunu aldı. Bazı kaynak kodu eleme sonra olsa da, bunu ben ilk düşünmüştü olarak oldukça zahmetli olmadığını anladı. Her alma yöntemi BasePeer modelin doSelect() yöntemiyle geçer, bu yüzden sadece overrode ki özelleştirilebilir Peer modeli bir:

static public function doSelect( Criteria $criteria, PropelPDO $con = null ) {
  $all_widgets = parent::doSelect( $criteria, $con );
  $widgets     = array();

  foreach ( $widgets as $i => $widget ) {
    #if( authorized ) {
    #  array_push( $widgets, $widget );
    #}
  }

  return $widgets;
}

Ben henüz yetkilendirme için hizmet çağrıyı kablolu değil, ama bu sonuç kümesini değiştirmek için beklendiği gibi çalışması için görünür. Ben ek modeli örnekleri için yetkilendirme sağlamak zorunda ve eğer, ben KURU kalması davranışları tekrar gerekir, ancak bu o kadar güzel yeterli olacak gibi görünüyor.

Her şeyden önce, ben bu model katman kavrama düzeyini artırır beri davranış-tabanlı yaklaşım, yanlış olduğunu düşünüyorum.

Kendisine iletilen filtre parametreleri, sırasıyla size verir sfEventDispatcher::filter() yöntemi var.

Yani, taslak kod aşağıdaki gibi görünecektir:

<somewhere>/actions.class.php

public function executeBlabla(sfWebRequest $request)
{
  //...skip...
  $widgets = WidgetPeer::getWidgetsYouNeedTo();
  $widgets = $this->getEventDispatcher()->filter(new sfEvent($this, 'widgets.filter'), $widgets));
  //...skip...
}

apps/<appname>/config/<appname>Configuration.class.php

//...skip...
  public function configure()
  {
    $this->registerHandlers();
  }
  public function registerHandlers()
  {
    $this->getEventDispatcher()->connect('widgets.filter', array('WidgetFilter', 'filter'));
  }
//...skip

lib/utility/WidgetFilter.class.php

class WidgetFilter
{
  public static function filter(sfEvent $evt, $value)
  {
    $result = array();
    foreach ($value as $v)
    {
      if (!Something::isWrong($v))
      {
        $result[] = $v;
      }
    }
  }
}

Eğer bir fikriniz var umuyoruz.

İşte Symfony 1.2 Tahrik davranışları üzerinde bazı belgeler bulunuyor: http://www.symfony-project.org/cookbook/1_2/en/behaviors.

Neden sadece aradığınız kontrolleri yapar sizin Page nesne bir 'getAllowedWidgets' yöntemi yok? Gibi bir şey:

public function getAllowedWidgets($criteria = null, PropelPDO $con = null) {
  $widgets = $this->getWidgets($criteria, $con);
  $allowed = array();

  // get access rights from remote service

  foreach($widgets as $widget) {
    // widget allowed?
    $allowed[] = $widget;
  }

  return $allowed;
}

Eğer always bir Page'in Widget'lar seçerek bu onay yapılabilir istiyorsanız Ancak, daha sonra itmek davranışları en iyi bahis vardır.