在非对象上调用成员函数 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
我做了什么?
- 将我的 apache httpd.conf 重置为原来的。
- 编辑了 httpd.conf 以启用 php 和其他一些小调整。
- 克隆了 repo(master)
- 运行 让 composer 在我们的 composer.json 文件中安装所有库的脚本(/vendor 文件夹现在似乎有我需要的所有库),
- 将 DocumentRoot 更改为 /Library/WebServer/wsmcrm/
- 创建了我们的 PROD 数据库的本地副本。
- 更新了我们代码中的数据库连接以指向我的本地数据库以进行测试。
- 启动了 apache 服务器
- 启动了 mysql 服务器
当我访问 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 进行处理,而不是直接服务于控制器。
这解决了我这边的问题。
我刚刚加入了一个团队,从事基于 Symphony 和 Silex 作为 PHP 框架和作曲家作为包管理器的项目。该系统目前正在生产中使用并且运行良好。
所以问题是什么?当我在本地 运行 时,该应用程序惨遭失败:
Fatal error: Call to a member function get() on a non-object in /Library/WebServer/wsmcrm/session.php on line 9
我做了什么?
- 将我的 apache httpd.conf 重置为原来的。
- 编辑了 httpd.conf 以启用 php 和其他一些小调整。
- 克隆了 repo(master)
- 运行 让 composer 在我们的 composer.json 文件中安装所有库的脚本(/vendor 文件夹现在似乎有我需要的所有库),
- 将 DocumentRoot 更改为 /Library/WebServer/wsmcrm/
- 创建了我们的 PROD 数据库的本地副本。
- 更新了我们代码中的数据库连接以指向我的本地数据库以进行测试。
- 启动了 apache 服务器
- 启动了 mysql 服务器
当我访问 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 进行处理,而不是直接服务于控制器。
这解决了我这边的问题。