silex 控制器 setter 注入
silex controller setter injection
我是 PHP/silex 的新手。
问题:无法将依赖项注入控制器。
控制器:
class MediaController implements ControllerProviderInterface
{
private $serviceManager;
public function setService($service)
{
$this->serviceManager = $service;
}
public function getMedia($id)
{
$this->serviceManager->getMediaService()->getMedia($id);
}
public function connect(Application $app)
{
$controllers = $app['controllers_factory'];
$controllers->get('/id={id}', 'Controllers\Instagram\MediaController::getMedia');
$controllers->get('/test', 'Controllers\Instagram\MediaController::test');
return $controllers;
}
}
注入配置文件 routes.php(此文件是从 config.php 文件中调用的,该文件也是从 app.php 中调用的,而 app.php 也是从 index.php 中调用的文件):
function getMediaController($app) {
$mediaController = new \Controllers\Instagram\MediaController();
$mediaController->setService(new \Service\InstagramServiceManager());
return $mediaController;
}
$app->mount('/media', getMediaController($app));
启动php内置服务器:php -S localhost:8080 /web
测试路径:/media/id=1
错误:PHP 致命错误:在第 41 行 /home/fernando/projects/php/silex/api_media_location_v2/src/controllers/instagram/MediaController.php 的非对象上调用成员函数 getMediaService()
来自 MediaController.php 的第 41 行:
$this->serviceManager->getMediaService()->getMedia($id);
关于如何将服务注入控制器有什么建议吗?
已解决:问题似乎出在控制器的魔术方法上:
__set($propertyName, $propertyValue) {}
我刚刚为服务创建了自定义 setter:
public function setService($service) {}
此外,我在控制器的连接方法中发现了一个问题,我已经替换了这一行:
$controllers->get('/test', 'Controllers\Instagram\MediaController::test');
对于这些:
$controllers->get('/test', $this->test());
我是 PHP/silex 的新手。
问题:无法将依赖项注入控制器。
控制器:
class MediaController implements ControllerProviderInterface
{
private $serviceManager;
public function setService($service)
{
$this->serviceManager = $service;
}
public function getMedia($id)
{
$this->serviceManager->getMediaService()->getMedia($id);
}
public function connect(Application $app)
{
$controllers = $app['controllers_factory'];
$controllers->get('/id={id}', 'Controllers\Instagram\MediaController::getMedia');
$controllers->get('/test', 'Controllers\Instagram\MediaController::test');
return $controllers;
}
}
注入配置文件 routes.php(此文件是从 config.php 文件中调用的,该文件也是从 app.php 中调用的,而 app.php 也是从 index.php 中调用的文件):
function getMediaController($app) {
$mediaController = new \Controllers\Instagram\MediaController();
$mediaController->setService(new \Service\InstagramServiceManager());
return $mediaController;
}
$app->mount('/media', getMediaController($app));
启动php内置服务器:php -S localhost:8080 /web
测试路径:/media/id=1
错误:PHP 致命错误:在第 41 行 /home/fernando/projects/php/silex/api_media_location_v2/src/controllers/instagram/MediaController.php 的非对象上调用成员函数 getMediaService()
来自 MediaController.php 的第 41 行:
$this->serviceManager->getMediaService()->getMedia($id);
关于如何将服务注入控制器有什么建议吗?
已解决:问题似乎出在控制器的魔术方法上:
__set($propertyName, $propertyValue) {}
我刚刚为服务创建了自定义 setter:
public function setService($service) {}
此外,我在控制器的连接方法中发现了一个问题,我已经替换了这一行:
$controllers->get('/test', 'Controllers\Instagram\MediaController::test');
对于这些:
$controllers->get('/test', $this->test());