没有编写器自动加载类命名空间的问题


Problems for autoload class namespace without composer

我有一些问题注册一个bundle在Symfony2项目没有Composer
在我的公司,由于代理,我不能使用Composer。

我成功安装了FOSUserBundle,所以我不明白为什么它不能与KnpSnappyBundle一起工作…

My vendor tree:

vendor/
    friendofsymfony/
        user-bundle/
            FOS/
                UserBundle/
                    FOSUserBundle.php
    knplabs/
        knp-snappy-bundle/
            Knp/
                Bundle/
                    SnappyBundle/
                        KnpSnappyBundle.php

我的app/autoload.php:

<?php
use Doctrine'Common'Annotations'AnnotationRegistry;
use Composer'Autoload'ClassLoader;
/**
 * @var ClassLoader $loader
 */
$loader = require __DIR__.'/../vendor/autoload.php';
$loader->add('FOS', __DIR__.'/../vendor/friendsofsymfony/user-bundle');
$loader->add('Knp', __DIR__.'/../vendor/knplabs/knp-snappy-bundle');
AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
return $loader;

My app/AppKernel.php:

<?php
use Symfony'Component'HttpKernel'Kernel;
use Symfony'Component'Config'Loader'LoaderInterface;
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            new Symfony'Bundle'FrameworkBundle'FrameworkBundle(),
            new Symfony'Bundle'SecurityBundle'SecurityBundle(),
            new Symfony'Bundle'TwigBundle'TwigBundle(),
            new Symfony'Bundle'MonologBundle'MonologBundle(),
            new Symfony'Bundle'SwiftmailerBundle'SwiftmailerBundle(),
            new Symfony'Bundle'AsseticBundle'AsseticBundle(),
            new Doctrine'Bundle'DoctrineBundle'DoctrineBundle(),
            new Sensio'Bundle'FrameworkExtraBundle'SensioFrameworkExtraBundle(),
            new My'Bundle'OwnBundle'MyOwnBundle(),
            new FOS'UserBundle'FOSUserBundle(),
            new Knp'Bundle'SnappyBundle'KnpSnappyBundle()
        );
        if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            $bundles[] = new Symfony'Bundle'WebProfilerBundle'WebProfilerBundle();
            $bundles[] = new Sensio'Bundle'DistributionBundle'SensioDistributionBundle();
            $bundles[] = new Sensio'Bundle'GeneratorBundle'SensioGeneratorBundle();
        }
        return $bundles;
    }
    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
    }
}

错误信息:

ClassNotFoundException: Attempted to load class "KnpSnappyBundle" from namespace "Knp'Bundle'SnappyBundle" in C:'xampp'htdocs'my-project'app'AppKernel.php line 25. Do you need to "use" it from another namespace?

找到了!

所以这是一个很好的过程,但我忘记了清除缓存

php app/consoloe ca:cl -e=dev

之后,我仍然有一个错误:

Fatal error: Interface 'Knp'Snappy'GeneratorInterface' not found in /vendor/bundles/Knp/Bundle/SnappyBundle/Snappy/LoggableGenerator.php on line 14

因为没有Composer的一部分KnpSnappyBundle是缺失的,所以我在GitHub和上下载丢失的目录,并添加在我的vendor :

vendor/
    knplabs/
        knp-snappy-bundle/
            Knp/
                Bundle/
                    SnappyBundle/
                        KnpSnappyBundle.php
                Snappy/
                    Exeption/
                    AbstractGenerator.php
                    GeneratorInterface.php
                    Image.php
                    Pdf.php
                    Process.php

一切正常,我没有修改我的app/autoload.phpapp/AppKernel.php .

目前问题已解决。

作曲家:

composer require knplabs/knp-snappy
composer require h4cc/wkhtmltopdf-amd64

Symfony使用:

use Knp'Snappy'Pdf;

代码:

$knpSnappyPdf = new Pdf();
$knpSnappyPdf->setBinary(__DIR__ . '/vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64');
$html = $this->renderView('Pdf/template.html.twig', [
    ...
]);
$data = $knpSnappyPdf->getOutputFromHtml($html);

这个bundle解决了我使用基于绝对路径的本地图像的问题。