我正在尝试在symfony2中实现存折Web服务并遵循此passbook bundle,我的控制器看起来像这样
if ($form->isValid()) {
// Create an event ticket
$pass = new EventTicket("1234567890", "The Beat Goes On");
$pass->setBackgroundColor('rgb(60, 65, 76)');
$pass->setLogoText('Apple Inc.');
// Create pass structure
$structure = new Structure();
// Add primary field
$primary = new Field('event', 'The Beat Goes On');
$primary->setLabel('Event');
$structure->addPrimaryField($primary);
// Add secondary field
$secondary = new Field('location', 'Moscone West');
$secondary->setLabel('Location');
$structure->addSecondaryField($secondary);
// Add auxiliary field
$auxiliary = new Field('datetime', '2013-04-15 @10:25');
$auxiliary->setLabel('Date & Time');
$structure->addAuxiliaryField($auxiliary);
// Add icon image
$icon = new Image('appassBundle/Resources/Images/icon.png', 'icon');
$pass->addImage($icon);
// Set pass structure
$pass->setStructure($structure);
// Add barcode
$barcode = new Barcode(Barcode::TYPE_QR, 'barcodeMessage');
$pass->setBarcode($barcode);
// Create pass factory instance
$factory = new PassFactory('pass.dk.mcoupons.mcoupon', '9W6X83AQ63', 'KA Innovation ApS', '%kernel.root_dir%/Resources/certificates/certificate.p12', 'hestmink09', '%kernel.root_dir%/Resources/certificates/applewwdrca.pem');
$factory->setOutputPath('%kernel.root_dir%/logs/pkpass');
$factory->package($pass);
//$em = $this->getDoctrine()->getEntityManager();
//$em->persist($task);
//$em->flush();
echo 'pass generated ';
return $this->render('apbappassBundle:Default:index.html.twig');
}
但它给了我这个错误
SplFileObject :: __ construct(appassBundle / Resources / Images / icon.png):无法打开流:没有这样的文件或目录 500内部服务器错误 - RuntimeException
我尝试了不同的方法来提供路径但失败了。 这是我的图像存储的层次结构或文件夹结构
答案 0 :(得分:4)
错误告诉所有。这意味着您的Image
对象会尝试在引擎盖下实现SplFileObject
由于您提供的文件不存在,因此您需要SplFileObject::__construct()
throws an exception。
相对路径很容易成为噩梦,CLI SAPI等。可以弄乱一切。简单的解决方法是使用ABSOLUTE路径。我看到两种方法来处理它。
为了获得当前的绝对路径,您可以使用__DIR__
魔法常量。这是一个使用示例
// apb/appassBundle/Controller/BarController::fooAction
$iconPath = sprintf("%s/../Resources/Images/icon.png", __DIR__);
$icon = new Image($iconPath, "icon");
$iconPath
现在包含图标的绝对路径。例如:
/path/to/project/src/apb/appassBundle/Controller/../Resources/Images/icon.png
哪个是正确的,文件实际存在。
另一种方法是获取存储在bundle中的路径。 BundleInterface
有一个getPath()
方法,它返回包的绝对路径。 (捆绑的根目录)
// apb/appassBundle/Controller/BarController::fooAction
$bundle = $this->get('kernel')->getBundle('apbappassBundle');
$iconPath = sprintf("%s/Resources/Images/icon.png", $bundle->getPath());
$icon = new Image($iconPath, "icon");
$iconPath
现在包含类似
/path/to/project/src/apb/appassBundle/Resources/Images/icon.png
哪个也正确
编辑17/07/2014
作为mentionned by gilden,另一种方法是使用KernelInterface::locateResource方法 你可以像这样使用它
$iconPath = $this->get('kernel')->locateResource('@apbappassBundle/Resources/Images/icon.png');
$icon = new Image($iconPath, "icon");
答案 1 :(得分:1)
尝试
$icon = new Image('%kernel.root_dir%/appassBundle/Resources/Images/icon.png', 'icon');
或者也许:
$iconPath = $this->get('kernel')->getRootDir().'/appassBundle/Resources/Images/icon.png';
$icon = new Image($iconPath, 'icon');
或类似的,我没有看到你项目的整体结构。