Оператор Symfony " use " для другого пространства имен?" вопрос

у меня проблема с пространствами имен при подключении моего класса сущности к классу абстрактного типа.

мне нужно создать AbstractType класс, который я назвал BlogFactory. Я намерен использовать его в своем createAction функция my BlogController.в PHP класс сущности для создания записи в блоге.

мой BlogFactory класса в Форма/Блог каталог моего пакета, как показывает древовидная структура.

.
.
.
src/Blogger/BlogBundle/
├── Controller
│   ├── BlogController.php
│   └── PageController.php
├── DataFixtures
│   └── ORM
│       └── BlogFixtures.php
├── Entity
│   ├── Blog.php
│   ├── Blog.php~
│   └── Enquiry.php
├── Form
│   ├── Blog
│   │   ├── BlogFactory.php
│   │   └── Factory.php
│   └── EnquiryType.php
├── Resources
│   ├── config
│   │   ├── config.yml
│   │   ├── routing.yml
│   │   └── services.yml
.
.
.

In the BlogController.php класс сущности, я включаю следующее использовать инструкция:

namespace BloggerBlogBundleController;

use SymfonyComponentHttpFoundationRequest;
use SymfonyBundleFrameworkBundleControllerController;
use BloggerBlogBundleFormBlogBlogFactory;

class BlogController extends Controller{
.
.
.

следующим createAction функция:

public function createAction(){   
        $form = $this->createForm(new BlogFactory(), new Blog(), 
            array(
                'action' => $this->generateUrl('blog_create'),
                'method' => 'POST',
            )
        );

        $form->add('submit', 'submit', array('label'=>'Create'));
        return $form;
    }

вот код в мой BlogFactory класс:

namespace BloggerBlogBundleForm;

use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;

class BlogFactory extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('title');
        $builder->add('author');
        $builder->add('blog');
        $builder->add('image');
    }

    public function getName()
    {
        return 'newblog';
    }
}

однако моя проблема в том, что я получаю следующую ошибку:

The autoloader expected class "BloggerBlogBundleFormBlogBlogFactory" to be defined in file "/var/www/Symfony-Blog/src/Blogger/BlogBundle/Form/Blog/BlogFactory.php". The file was found but the class was not in it, the class name or namespace probably has a typo

я застрял и не уверен, как это решить.

обновление:

как предложил Gnucki, я добавил пространство имен БлоггерBlogBundleФормаБлог; в мой BlogFactory.php и использовать BloggerBlogBundleFormBlogBlogFactory; в BlogController.php, и получил немного другую ошибку ниже:

Attempted to load class "Blog" from namespace "BloggerBlogBundleController".
Did you forget a "use" statement for another namespace?

1 ответов


существует проблема сопоставления между вашими каталогами и пространствами имен:

вы говорите, что класс BlogFactory находится в Form/Blog/BlogFactory.php и вы определяете класс в пространстве имен Blogger\BlogBundle\Form.

вы должны использовать это пространство имен для класса BlogFactory:

namespace Blogger\BlogBundle\Form\Blog;

затем укажите эти операторы use в контроллере:

use Blogger\BlogBundle\Form\Blog\BlogFactory;
use Blogger\BlogBundle\Entity\Blog;

объяснение:

в простом приложении PHP вы используете некоторые require или include для включения файлов друг в друга. Но это действительно скучно. Вместо этого, вы можете использовать Автозагрузка функция чтобы справиться с этим. В Symfony2 реализует его таким образом, что пространство имен отображается в каталоге логическим путем. Например, класс Blogger\BlogBundle\Entity\Blog можно найти в /Blogger/BlogBundle/Entity/Blog.php.

если вы хотите использовать класс в другом (с другим пространством имен (так другой каталог)), вы можете использовать для пример:

new \Blogger\BlogBundle\Entity\Blog();

или:

use Blogger\BlogBundle\Entity\Blog;

new Blog();

представьте, что вы находитесь в другом пространстве имен whitout, который использует:

namespace Blogger\BlogBundle\Controller;

new Blog();

класс Blog будет интерпретироваться как class Blogger\BlogBundle\Controller\Blog.

namespace Blogger\BlogBundle\Controller;

use Blogger\BlogBundle\Entity\Blog;

new Blog();

теперь, с использованием, Blog будет интерпретироваться как Blogger\BlogBundle\Entity\Blog.

посмотреть пространства имен в PHP для получения дополнительной информации.