我正在创建一个小型Web应用程序,并且有一些具有类似基本功能的控制器,如用户配置文件检索等。
目前,每个动作都调用了这些方法 我想移动它们以获得更好的代码结构。
但我不确定最佳做法是什么。在我看来,有两种方法:
connect
方法)“基础”控制器有一个要求,它必须接收Silex应用程序的实例。
我希望有更简单的方法来做到这一点 提前感谢每一个提示。
答案 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 ...
}
}