2014-02-07 1 views
1

Я создаю небольшое веб-приложение и имею несколько контроллеров с подобными базовыми функциями, такими как получение профиля пользователя и тому подобное.Лучшая практика для инициализации общих переменных контроллера?

В настоящий момент каждое действие имеет призывы к этим методам.
Я хочу переместить их, чтобы получить лучшую структуру кода.

Но я не уверен, какой будет лучшая практика. На моем взгляде, есть два подхода:

  • создать метод в родительском абстрактном контроллере и вызывать их из каждого унаследованного контроллера
  • использования перед фильтром (может это переменный класс доступа?)
  • (используя connect метод)

Существует одно требование для «базового» контроллера, оно должно получить экземпляр приложения Silex.

Надеюсь, что есть более простой способ сделать это.
Заранее благодарим за любые подсказки.

+0

Я бы пойдите с родительским абстрактным базовым контроллером лично - кажется, лучше всего подходит моему разуму. – CD001

ответ

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 
    } 
} 

Очевидно, что я не имею ни малейшего представления о текущей архитектуре или текущем коде, но вы получите идею.

EDIT:

Обновлено касаемо требования Silex.

У меня на самом деле есть API, написанный в Silex. Передний контроллер для приложения находится в /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) так же, как и для маршрутов.

+0

Спасибо за ваш ответ. Я добавил новую информацию к моему вопросу. Мне нужен экземпляр приложения Silex в контроллере. – CSchulz

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 ... 
    } 
}