初始化通用控制器变量的最佳实践?

时间:2014-02-07 16:12:04

标签: php symfony symfony-2.3 silex

我正在创建一个小型Web应用程序,并且有一些具有类似基本功能的控制器,如用户配置文件检索等。

目前,每个动作都调用了这些方法 我想移动它们以获得更好的代码结构。

但我不确定最佳做法是什么。在我看来,有两种方法:

  • 在父抽象控制器中创建方法并从每个继承的控制器中调用它们
  • 在过滤之前使用(它可以访问类变量吗?)
  • (使用connect方法)

“基础”控制器有一个要求,它必须接收Silex应用程序的实例。

我希望有更简单的方法来做到这一点 提前感谢每一个提示。

2 个答案:

答案 0 :(得分:1)

我可能会这样做:

class BaseController {
    $user = null;

    public function __contruct() {
        $this->user = someFunctionToGetUser();
    }
}

class Controller1 extends BaseController {
    public function someFunction1() {
        // $this->user is set and accessible here
    }
}

class Controller2 extends BaseController {
    public function someFunction2() {
        // $this->user is set and accessible here too
    }
}

class Controller3 extends BaseController {
    public function someFunction3() {
        // $this->user is set and accessible here too also
    }
}

显然,我不了解您当前的架构或当前的代码,但您明白了。

编辑:

更新了Silex要求。

我实际上有一个用Silex编写的API。应用程序的前端控制器位于/web/index.php中。 index.php看起来像这样:

$app = require __DIR__.'/../bootstrap.php';
$app->run();

bootstrap.php看起来像这样:

require __DIR__ . '/vendor/autoload.php';
$app = new Silex\Application();
require APP_ROUTES . 'Ranges.php';
return $app;

Ranges.php的一个示例是:

$app->get('/ranges', function () use ($app) {
    // some code to generate results
    return $app->json($results);
}

您可以轻松地将类设置为使用$ app(silex实例),就像我对路径所做的那样。

答案 1 :(得分:0)

我正在使用controlles in classes并使用具有此结构的父类

class ParentSample
{
  protected $app = null;

  public function __construct(Application $app=null) {
    if (!is_null($app)) {
        $this->initialize($app);
    }
  }

  protected function initialize(Application $app)
  {
    $this->app = $app;
  }
}

在扩展类中,如果需要,控制器会扩展initialize()并在控制器中首先调用它:

class SubClass extends ParentClass
{
  protected function initialize(Application $app)
  {
    parent::initialize($app);

    // further initialization
  }

  public functin ControllerSample(Application $app)
  {
    $this->initialize($app);

    // controller response ... 
  }
}