Symfony插件sfDoctrineActAsTaggablePlugin不工作 [英] Symfony plugin sfDoctrineActAsTaggablePlugin not working

查看:173
本文介绍了Symfony插件sfDoctrineActAsTaggablePlugin不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我发现 sfDoctrineActAsTaggablePlugin ,这似乎正是我需要的。



问题是,当我想要保存一个Taggable对象,我得到这个错误:

 未知记录属性/相关组件saved_tagsonMishidea

Mishidea是我想要标记的类/表的名称。



以下是我的schema.yml文件的相关部分:

  Mishidea:
连接:doctrine
actAs:{Timestampable:〜,Taggable:〜}
tableName:mishidea
列:
idea_id:
类型:整数(4)
primary:true
autoincrement:true
idea_title:
type:string()
notnull:true
prim ary:false
idea_summary:
type:string()
notnull:true
primary:false
idea_description:
type:string()
notnull:true
primary:false
idea_up:
类型:integer(8)
notnull:true
默认值:0
primary:false
idea_down:
类型:integer(8)
notnull:true
默认值:0
primary:false
idea_confirmation:
type:boolean )
默认值:false
primary:false
group_id:
类型:integer(4)
notnull:false
primary:false
关系:
Mishgroup:
local:group_id
外观:group_id
类型:一个
构思:
local:idea_id
foreign:idea_id
类型:many
Mishdocument:
local:idea_id
foreign:idea_id
类型:many
RelIdeafollower:
local:idea_id
foreign:idea_id
type:many

我还尝试了类的actAs属性的其他类型的语法,如:

  actAs:
时间戳:〜
可伸缩:〜

和:

  actAs:[Timestampable,Taggable] 

但它是不是我遇到的问题:

  $ timestampable0 = new Doctrine_Template_Timestampable(); 
$ taggable0 = new Taggable();
$ this-> actAs($ timestampable0);
$ this-> actAs($ taggable0);

在我的模型的BaseMishidea.php类。


$ b $我不明白为什么Mishidea类没有得到Taggable类应该添加的属性,因为模型似乎通过$ this-> actAs()语句来添加行为。



如何让这个插件工作?



如果这有帮助,我使用Symfony 1.4与MySQL / InnoDB,我曾尝试过使用PostgreSql DBMS,结果相同。



您的帮助将不胜感激。



谢谢

FuzzyTern






EDIT1 - 关于什么说johnwards:任何人都可以确认通过actAs:而不是templates:添加到schema.yml文件中的Taggable行为?这就是我在这里读到的(见我对johnwards的帖子的评论),但既然这两种解决方案都不适合我,我不太清楚。当使用templates关键字时,我得到:

 未知方法Mishidea :: addTag 

,并且不会生成模型的特定类。






EDIT2 - 进一步调查后,我发现Symfony堆栈跟踪是interresting。
确实,当我这样做:

  $ idea = new Mishidea(); 
$ idea-> save();

TaggableListener被调用(下面的堆栈跟踪中的第8点),这表明该关系正在运行。但是我不明白是怎么回事,导致了例外。



堆栈跟踪:

  1。 at()
在SF_ROOT_DIR / lib / vendor / symfony / lib / plugins / sfDoctrinePlugin / lib / vendor / doctrine / Doctrine / Record / Filter / Standard.php行55 ...

public function filterGet(Doctrine_Record $ record,$ name)

{

throw new Doctrine_Record_UnknownPropertyException(sprintf('未知记录属性/相关组件%son%s ',$ name,get_class($ record)));

}

}

2.在Doctrine_Record_Filter_Standard-> filterGet(object('Mishidea')''saved_tags')
在SF_ROOT_DIR / lib / vendor / symfony / lib / plugins / sfDoctrinePlugin / lib / vendor / doctrine / Doctrine / Record.php行1374 ...
3.在Doctrine_Record-> _get('saved_tags',1)
在SF_ROOT_DIR / lib / vendor / symfony / lib / plugins / sfDoctrinePlugin / lib / vendor / doctrine / Doctrine / Record.php行1333 ...
4.在Doctrine_Record-> get('saved_tags ')
在n / a行中n / a ...
5.在call_user_func_array(array(object('Mishidea'),'get'),array('saved_tags'))
在SF_ROOT_DIR / lib / vendor / symfony / lib / plugins / sfDoctrinePlugin / lib / record / sfDoctrineRecord.class.php行212 ...
6.在sfDoctrineRecord-> __调用('getSavedTags',array() )
在n / a行n / a ...
7.在Mishidea-> getSavedTags()
在SF_ROOT_DIR / plugins / sfDoctrineActAsTaggablePlugin / lib / TaggableTemplate.class.php行93 ...
8.在TaggableListener-> pos tSave(对象('Doctrine_Event'))
在SF_ROOT_DIR / lib / vendor / symfony / lib / plugins / sfDoctrinePlugin / lib / vendor / doctrine / Doctrine / Record / Listener / Chain.php行237 ...
9.在Doctrine_Record_Listener_Chain-> postSave(object('Doctrine_Event'))
在SF_ROOT_DIR / lib / vendor / symfony / lib / plugins / sfDoctrinePlugin / lib / vendor / doctrine / Doctrine / Record.php行355 ...
10.在Doctrine_Record-> invokeSaveHooks('post','save',object('Doctrine_Event'))
在SF_ROOT_DIR / lib / vendor / symfony / lib / plugins / sfDoctrinePlugin / lib / vendor / doctrine / Doctrine / Connection / UnitOfWork.php line 112 ...
11.在Doctrine_Connection_UnitOfWork-> saveGraph(object('Mishidea'))
在SF_ROOT_DIR / lib / vendor / symfony /lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php line 1691 ...
12.在Doctrine_Record-> save()
在SF_ROOT_DIR / apps / frontend / modules / idea / actions / actions.class.php line 24 ...

如果有人想看到堆栈跟踪的任何点的代码(只有1.在这里被扩展),只是问。
欢迎任何建议。

解决方案

Whoop whoop!
我解决了这个问题,最后!



嗯...问题是,sfDoctrineActAsTaggablePlugin插件只适用于具有id属性的标签对象精确的id。我喜欢将实体的名称放在我的属性名下,这就是为什么我打电话给我的标签实体idea_id的想法。



只要我用id替换idea_id,一切都像一个魅力(你可能需要在schema.yml中进行几个更改,甚至在route.yml文件稍后)。



我不知道我是否清楚,所以不要犹豫,问我进一步的解释。



无论如何,这个插件有点遗憾,它不够通用(将这个报告给开发人员)。



BTW,所有在我的第一篇文章中写的actAs的语法是等效的,使用你喜欢的。



感谢大家的帮助,每个回复都是鼓励,没有我没有力量找到这个错误;)。



干杯


I want to attribute some tags to some of the objects of my doctrine model.

I found sfDoctrineActAsTaggablePlugin which seems to be precisely what I need.

The problem is that when I want to save a Taggable object, I get this error:

Unknown record property / related component "saved_tags" on "Mishidea"

Mishidea is the name of the class/table that I want to be Taggable.

Here is the related portion of my schema.yml file:

Mishidea:
  connection: doctrine
  actAs: {Timestampable: ~ , Taggable: ~ }      
  tableName: mishidea
  columns:
    idea_id:
      type: integer(4)
      primary: true
      autoincrement: true
    idea_title:
      type: string()
      notnull: true
      primary: false
    idea_summary:
      type: string()
      notnull: true
      primary: false
    idea_description:
      type: string()
      notnull: true
      primary: false
    idea_up:
      type: integer(8)
      notnull: true
      default: 0
      primary: false
    idea_down:
      type: integer(8)
      notnull: true
      default: 0
      primary: false
    idea_confirmation:
      type: boolean(1)
      default: false
      primary: false
    group_id:
      type: integer(4)
      notnull: false
      primary: false
  relations:
    Mishgroup:
      local: group_id
      foreign: group_id
      type: one
    Ideacomment:
      local: idea_id
      foreign: idea_id
      type: many
    Mishdocument:
      local: idea_id
      foreign: idea_id
      type: many
    RelIdeafollower:
      local: idea_id
      foreign: idea_id
      type: many

I also tried other types of syntax for the actAs attribute of the class such as:

actAs:
    Timestampable: ~
    Taggable: ~

and:

actAs:[Timestampable,Taggable]

But it's not the problem as I get :

$timestampable0 = new Doctrine_Template_Timestampable();
$taggable0 = new Taggable();
$this->actAs($timestampable0);
$this->actAs($taggable0);

in the BaseMishidea.php class of my model.

I don't understand why the Mishidea class doesn't get the attributes that the Taggable class should add to it since the model seems to add the behaviour via the $this->actAs() statement.

How to get this plugin working?

If that helps, I use Symfony 1.4 with MySQL/InnoDB and I had tried before with the PostgreSql DBMS, with the same result.

Your help would be much appreciated.

Thanks

FuzzyTern


EDIT1 - Regarding what said johnwards : Can anyone confirm that the Taggable behaviour is added in the schema.yml file via "actAs:", not "templates:"? That's what I read here and there (see my comment on johnwards' post) but since neither of both solutions work for me, I'm not sure. When using the "templates" keyword I get:

Unknown method Mishidea::addTag

and the specific classes of the model aren't generated.


EDIT2 - After a further investigation, I found that the Symfony stack trace is interresting. Indeed, when I do:

$idea = new Mishidea();
$idea->save();

the TaggableListener is called (point 8 in the stack trace below), which shows that the relation is working. But then I don't understand what's going on and leads to the exception.

Stack trace:

1. at ()
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record/Filter/Standard.php line 55 ...

    public function filterGet(Doctrine_Record $record, $name)

    {

        throw new Doctrine_Record_UnknownPropertyException(sprintf('Unknown record property / related component "%s" on "%s"', $name, get_class($record)));

    }

}

2. at Doctrine_Record_Filter_Standard->filterGet(object('Mishidea'), 'saved_tags')
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php line 1374 ...
3. at Doctrine_Record->_get('saved_tags', 1)
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php line 1333 ...
4. at Doctrine_Record->get('saved_tags')
in n/a line n/a ...
5. at call_user_func_array(array(object('Mishidea'), 'get'), array('saved_tags'))
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/record/sfDoctrineRecord.class.php line 212 ...
6. at sfDoctrineRecord->__call('getSavedTags', array())
in n/a line n/a ...
7. at Mishidea->getSavedTags()
in SF_ROOT_DIR/plugins/sfDoctrineActAsTaggablePlugin/lib/TaggableTemplate.class.php line 93 ...
8. at TaggableListener->postSave(object('Doctrine_Event'))
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record/Listener/Chain.php line 237 ...
9. at Doctrine_Record_Listener_Chain->postSave(object('Doctrine_Event'))
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php line 355 ...
10. at Doctrine_Record->invokeSaveHooks('post', 'save', object('Doctrine_Event'))
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/UnitOfWork.php line 112 ...
11. at Doctrine_Connection_UnitOfWork->saveGraph(object('Mishidea'))
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php line 1691 ...
12. at Doctrine_Record->save()
in SF_ROOT_DIR/apps/frontend/modules/idea/actions/actions.class.php line 24 ...

If someone wants to see the code for any point of the stack trace (only 1. is expanded here), just ask. Any suggestion is welcomed.

解决方案

Whoop whoop!! I solved this problem, at last!

Well... The problem is that the sfDoctrineActAsTaggablePlugin plugin does work only for taggable objects which have an id property called precisely "id". I like to put the name of the entity in the name of my properties, that's why I called the idea of my taggable entity "idea_id".

As soon as I replaced "idea_id" by "id" everything worked like a charm (you may have several changes to do in the schema.yml and maybe even in the routing.yml file later on).

I don't know if I'm clear enough so don't hesitate to ask me further explanations.

Anyway that's a bit of a shame for this plugin, it is not generic enough (will report this to the developers).

BTW, all the syntaxes for actAs written in my first post are equivalent, use whichever you prefer.

Thank you all for your help, each reply was an encouragement without which I wouldn't have had the strength to find the bug ;).

Cheers

这篇关于Symfony插件sfDoctrineActAsTaggablePlugin不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆