Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ApplicationFlash Sınıfının Yapımı #43

Open
gdemir opened this issue Jan 6, 2020 · 2 comments
Open

ApplicationFlash Sınıfının Yapımı #43

gdemir opened this issue Jan 6, 2020 · 2 comments

Comments

@gdemir
Copy link
Member

gdemir commented Jan 6, 2020

Gerek var mı bilemedim şöyle bir class bir değişkenin ApplicationController sınıfına entegre edilmesiyle hallolabilir. close kısmı istek bitim sonrası çalıştırılması zorunlu alan. Bu sınıf modüler olamaz çünkü ApplicationController içersinde ekleniyor.

<?php

class ApplicationFlash {

  const FLASHKEYS = ["success", "info", "warning", "danger"];

  // in ApplicationController
  // $this->flash = [];
  // $this->flash["info"] = "gökhan";

  // ApplicationFlash::sets($this->flash);

  public static function sets($options) {
    foreach ($options as $key => $value) {
      if (!array_key_exists($key, self::FLASHKEYS))
        throw new Exception("Flash kullanımı için bilinmeyen anahtar → " . $key);

      $_SESSION[self::_storage_key()][$key] = $value;
    }
  }

  // alias
  // $flash = ApplicaionFlash::gets();
  // $flash variable access in templates
  // $flash["info"];

  public static function gets() {
    if (isset($_SESSION[self::_storage_key()]))
      return $_SESSION[self::_storage_key()];
    return null;
  }

  public static function close() {
    if (isset($_SESSION[self::_storage_key()]))
      unset($_SESSION[self::_storage_key()]);
  }

  private static function _storage_key() {
    return '_session_flashs';
  }

}
?>
@gdemir
Copy link
Member Author

gdemir commented Jan 6, 2020

Redirect 302 olduğundan bir flag olmalı. Bu flag istek aşamasında eğer flash varsa true atanacak istek kapanırken false çekildiği yerde veriler silinecek. Ama bu sefer 200 dönüşleri için sorun olur mu ? Bu durum bir sonraki istek sonuna kadar silinmememiş olması problem yaratır mı?

@gdemir
Copy link
Member Author

gdemir commented Jan 6, 2020

BarakApplication için

1 - ilklendirme için _init_options() kısmında aşağıdaki kod set edilmeli:

ApplicationFlash::init(); // daha önceki istekde set edilen varsa silinmesi için bayrak dik

2 - sonlandırma için _close_options() kısmında aşağıdaki kod set edilmeli:

ApplicationFlash::close(); // bayrak dikiliyse sil

ApplicationController için

1 - Yük değişkeninin tanımlanması

  protected $flash = [];

2 - Aşağıdaki kod satırından önce yere before ve after action için eklenmeli

  if (!empty($this->flash)) ApplicationFlash::sets($this->flash);

  // interrupt ?
  if ($this->_redirect_to || $this->_render || $this->_send_data) return TRUE;

3 - Aşağıdaki kod satırından sonra yere main action için eklenmeli

    // main action çalışma sonrası
    // içeriğin ne ile döneceğini bilmedğimizi varsayalım
    $main_content = NULL;

    // _localsda flash varsa çalıştıralım
    if (!empty($this->flash)) ApplicationFlash::sets($this->flash);

ApplicationView için

1 - Aşağıdaki kod satırları arasına set edilmeli

if ($main_render) {
      $this->locals["flash"] = ApplicationFlash::gets();
      self::$main_template = $this->template;
      self::$main_layout = $this->layout;
      self::$main_locals = $this->locals;
      ApplicationLogger::info("  Rendering " . self::$main_template . ".php within layouts/" . self::$main_layout . ".php");
    }

Tabi ki sınıfımız :

<?php

class ApplicationFlash {

  const FLASHKEYS = ["success", "info", "warning", "danger"];
  const FLASHFLAG = ".flag";

  public static function init() {
    if (isset($_SESSION[self::_storage_key()]))
      $_SESSION[self::_storage_key()][self::FLASHFLAG] = TRUE;
  }

  // in ApplicationController
  // $this->flash["info"] = "gökhan";

  // ApplicationFlash::sets($this->flash);

  public static function sets($options) {
    if ($options) {
    	ApplicationLogger::info(serialize($options));
      foreach ($options as $key => $value) {
        if (!in_array($key, self::FLASHKEYS))
          throw new Exception("Flash kullanımı için bilinmeyen anahtar → " . $key);

        $_SESSION[self::_storage_key()][$key] = $value;
      }
    }
  }

  // in ApplicationView
  // $this->_locals["flash"] = ApplicaionFlash::gets();
  // $flash variable access in templates
  // $flash["info"];

  public static function gets() {
    if (isset($_SESSION[self::_storage_key()]))
      return $_SESSION[self::_storage_key()];
    return null;
  }

  public static function close() {
    if (isset($_SESSION[self::_storage_key()][self::FLASHFLAG]))
      unset($_SESSION[self::_storage_key()]);
  }

  private static function _storage_key() {
    return '_session_flash';
  }

}
?>

Kullanım örneği bir HomeController sınıfında:

 public function logout() {
    if (isset($_SESSION["user"])) {
      $this->flash["success"] = "Başarılı bir şekilde oturum kapattınız";
      session_destroy();
    }
    $this->redirect_to("home/index");
  }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant