Использование PHP Slim Framework внутри классов - PullRequest
2 голосов
/ 25 февраля 2012

Мне кажется, я не могу получить платформу Slim для доступа к функциям внутри класса PHP:

<?php

class Controller {
    private $app;

    public function __construct() {
        $this->app = new Slim();

        $this->app->get('/', $this->home);

        $this->app->run();
    }

    public function home() {
        echo 'hi';
    }
}

Это вызывает следующую ошибку:

Неустранимая ошибка: необработанное исключение ErrorException с сообщением 'Неопределенное свойство: Controller :: $ home' в /Users/Oliver/Dropbox/Sites/grapevine/application/controller.php:9 Трассировка стека: # 0 /Users/Oliver/Dropbox/Sites/grapevine/application/controller.php(9): Slim :: handleErrors (8, 'Undefined prope ...', '/ Users / Oliver / D ...', 9, Array) # 1 /Users/Oliver/Dropbox/Sites/grapevine/public/index.php(14): Контроллер -> __ construct () # 2 {main}, брошенный в /Users/Oliver/Dropbox/Sites/grapevine/application/controller.php на строка 9

Я попытался сделать это вместо:

$this->app->get('/', $this->home());

Но тогда маршрутизация игнорируется, и на каждой странице отображается «привет», а не только «/». * 10101 *

Ответы [ 3 ]

12 голосов
/ 25 февраля 2012

Использовать синтаксис обратного вызова для функций-членов:

$this->app->get('/', array($this, 'home'));
2 голосов
/ 25 февраля 2012

Должно сработать следующее (хотя может потребоваться изменить вашу домашнюю функцию на статическую!):

$this->app->get('/', "Controller::home");
1 голос
/ 30 октября 2013

У меня это решение с инжектором конструктора из внутреннего контейнера Slim

В основном основная магия скрыта в __call функции

class App extends Slim
 public function __call($name, $params) {
  return function () use ($name, $params) {
  list($class, $action) = explode('_', $name . '_handle'); // default method is handle

  $args = [];
  $class = new \ReflectionClass($class);
  $constructor = $class->getConstructor();
  foreach ($constructor->getParameters() as $param) {
   $args[] = ($param->name === 'app') ? $this : $this->container->get($param->name);
  }
  $controller = $class->newInstanceArgs($args);
  return call_user_func([$controller, $action], func_get_args() + $params);
  };
 }
}

контроллер должен иметь приложение в параметрах конструктора:

class Homepage {

 public $app;

 public function __construct(\App $app) {
  $this->app = $app;
 }
}

И у index.php есть только настройки маршрутизатора

$app = new \App();
$app->get('/', $app->Homepage());
$app->run(

Посмотреть весь код здесь https://gist.github.com/OzzyCzech/7230064

...