Оператор 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 для получения дополнительной информации.