在非对象上调用成员函数 get() - Symfony 和 Silex

Call to a member function get() on a non-object - Symfony and Silex

我刚刚加入了一个团队,从事基于 Symphony 和 Silex 作为 PHP 框架和作曲家作为包管理器的项目。该系统目前正在生产中使用并且运行良好。

所以问题是什么?当我在本地 运行 时,该应用程序惨遭失败:

Fatal error: Call to a member function get() on a non-object in /Library/WebServer/wsmcrm/session.php on line 9

我做了什么?

当我访问 localhost/ 时,应用程序立即失败,出现上述异常。这种情况很少见,因为问题出在这条线上:

<?php

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use OMG\User;

$session = $app['controllers_factory'];
/*This is line 9 */ $session->get('/', function(Silex\Application $app) {

这告诉我 $session 为 null,这意味着 'controllers_factory' 不是 $app 中的数组项,这也很奇怪,因为就像我说的,它在产品中工作,实际上没有其他更改.

本质上,我们在这里从 index.php 调用 session.php:

return new RedirectResponse('/session/login');

只要本地没有存储 auth cookie,并且 /session 匹配:

$app->mount('/session', include 'session.php');

我只是不确定可能是什么问题,但我确定它与我的本地环境设置有关。

有什么想法吗?

这里是完整的 httpd.conf,以备您四处查看。

这似乎是会话创建的问题。如果您正在使用数据库会话管理,请确保您创建了正确的模式。

如果您使用文件会话,请确保在 php.ini at session.save_path 中设置的会话文件夹可从 apache 用户写入。

但为了确定,还要检查 apache 错误日志。

无论如何,这是我本地配置的问题。

初始请求 URI 是“/”,触发了 apache 服务 index.php。然而,当 index 重定向到“/session/*”时,apache 直接服务 "session.php" - 因此“$app”为空,而不是服务 index.php 并让他挂载 "session.php" ] 通过框架。

我必须编辑我的 .htaccess 并添加:

<IfModule mod_rewrite.c>
Options -MultiViews

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>

以便所有请求都通过 index.php 进行处理,而不是直接服务于控制器。

这解决了我这边的问题。