Я пытаюсь внедрить веб-службу сберегательной книжки в 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");