首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在类中使用PHP Slim框架

在类中使用PHP Slim框架
EN

Stack Overflow用户
提问于 2012-02-25 14:47:45
回答 3查看 7.3K关注 0票数 2

我似乎无法让Slim框架访问PHP类范围内的函数:

代码语言:javascript
复制
<?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';
    }
}

这将导致以下错误:

致命错误:在/Users/Oliver/Dropbox/Sites/grapevine/application/controller.php:9堆栈跟踪中带有消息“未定义的属性:控制器:$home”的未定义的异常“ErrorException”:#0 /Users/Oliver/Dropbox/Sites/grapevine/application/controller.php(9):Slim::handleError(8,“未定义的prope.”,‘/User//Users/Oliver/Dropbox/Sites/grapevine/application/controller.php(9):/D.’,9,数组) #1 /Users/Oliver/Dropbox/Sites/grapevine/public/index.php(14):控制器->__ /Users/Oliver/Dropbox/Sites/grapevine/application/controller.php () #2 {main}抛出到第9行的/Users/Oliver/Dropbox/Sites/grapevine/application/controller.php中。

我试过这样做:

代码语言:javascript
复制
$this->app->get('/', $this->home());

但是,路由将被忽略,“hi”将显示在每个页面上,而不仅仅是'/‘。

EN

回答 3

Stack Overflow用户

发布于 2012-02-25 15:22:03

对成员函数使用回调语法:

代码语言:javascript
复制
$this->app->get('/', array($this, 'home'));
票数 12
EN

Stack Overflow用户

发布于 2012-02-25 15:13:21

下面的操作应该是有效的(不过,将您的家庭功能更改为静态功能是必要的!):

代码语言:javascript
复制
$this->app->get('/', "Controller::home");
票数 2
EN

Stack Overflow用户

发布于 2013-10-30 10:15:12

我有来自Slim内部容器的构造函数注入的这个解决方案

基本上,主要魔力隐藏在__call函数中。

代码语言:javascript
复制
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);
  };
 }
}

控制器需要在构造函数参数中使用App:

代码语言:javascript
复制
class Homepage {

 public $app;

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

而index.php只有路由器设置

代码语言:javascript
复制
$app = new \App();
$app->get('/', $app->Homepage());
$app->run(

参见这里的完整代码,https://gist.github.com/OzzyCzech/7230064

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9444989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档