Ошибка SplFileObject не открыла поток: нет такого файла или каталога

Я пытаюсь внедрить веб-службу сберегательной книжки в symfony2 и следовать этому набору папок, и мой контроллер выглядит так

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

Я пробовал разные способы дать путь, но не смог. вот иерархия или структура папок, где хранятся мои изображения

структура папок

Пытаться

  $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'); 

Или похоже, я не вижу всей структуры вашего проекта.

проблема

Ошибка сообщает все. Это означает, что объект Image пытается создать SplFileObject под капотом.
Поскольку предоставленный вами файл не существует, SplFileObject::__construct() создает исключение, которое вы получаете.

исправлять

Относительные пути могут быть просто кошмаром, 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 

Это правильно, и файл действительно существует.

Абсолютный путь относительно пучка

Другой способ – получить путь, хранящийся в комплекте. 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

Как упоминалось в gilden , альтернативой может быть использование метода KernelInterface :: locateResource
Вы можете использовать его так

 $iconPath = $this->get('kernel')->locateResource('@apbappassBundle/Resources/Images/icon.png'); $icon = new Image($iconPath, "icon");