我正在寻找最有效的方法来将一组属性(配置)应用于新创建的实例。我的第一个目标是保持应用程序面向对象,第二个目标是使用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创建decorator?
将配置移动到xml/json/yaml…

最佳答案

我不明白你为什么需要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放到视图中。

09-25 16:42