面向对象PHP中的实例配置

时间:2013-04-14 19:05:16

标签: php static-methods

我正在寻找最有效的方法将一组属性(配置)应用于新创建的实例。我的第一个目标是保持面向应用程序对象,第二个目标是使用DI容器。这是我到目前为止提出的一个样本:

class ViewLogin {
  public $msgLoginGranted;
  public $msgLoginFailed;

  public function __construct(){
  }

  protected function onSuccess() {
    return $this->msgLoginGranted;
  }

  protected function onFailure() {
    return $this->msgLoginFailed;
  }
}

class ControllerLogin {
  public function __construct(ModelLogin $model, ViewLogin $view) {
  }
}

为了使ViewLogin保持干净并将配置数据从代码中分离出来,最好的做法是:

创建一个新类ViewLogin1

class ViewLogin1 extends ViewLogin {
  public function __construct() {
    $this->msgLoginGranted = 'Welcome!';
    $this->msgLoginFailed = 'Login Failed!';
  }
}

缺点:静态类内容,没有新功能,污染类空间

将配置对象传递给ViewLogin

class ViewLogin {
  public function __construct(Config1 $config) {
    $this->msgLoginGranted = $config->msgLoginGranted;
    $this->msgLoginFailed = $config->msgLoginFailed;
  }
}

为ViewLogin创建装饰器?

将配置移至XML / JSON / YAML ...

1 个答案:

答案 0 :(得分:1)

我不明白为什么你需要ViewLogin1。如果你想在你的框架中准备它并立即在应用程序中使用它我会在框架中使用ViewLoginAbstract并在应用程序中使用ViewLogin,即使没有引入新功能(请记住你会可能想要用die('What the hack are you trying to do?')或类似的东西替换重定向。

另一方面,如果您的应用程序中有多个登录表单,我会像Zend Framework那样继续使用。

当您查看他们如何使用*Controller class时,他们为每个控制器使用一个类,为视图使用一个通用ViewModel class

更详细地说,默认indexAction

public function indexAction()
{
    return new ViewModel(array(
        'content' => 'Placeholder page'
    ));
}

所以我重复使用ViewLogin并且只是传递配置,因为没有引入新功能(只是确保您不希望将来添加日志记录或其他功能)。

悬停在我看来,登录后重定向页面应该是控制器的责任而不是视图(视图应该只负责显示html +其他前端的东西)所以我不确定为什么你把redirect放到视图中