Insane Propel behavior that helps you to be compliant with third-party interfaces by adding type hint to generated methods.
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Build Status

The TypehintableBehavior behavior allows you to add typehints to generated methods (in Base classes).


Cherry-pick the TypehintableBehavior.php file is src/, put it somewhere, then add the following line to your propel.ini or configuration file:

propel.behavior.typehintable.class =


Just add the following XML tag in your schema.xml file:

<behavior name="typehintable">
    <parameter name="COLUMN_NAME" value="TYPEHINT" />
    <parameter name="RELATED_TABLE_NAME" value="TYPEHINT" />

If you fill in a column name as parameter's name, the typehint will be added to the corresponding setter methods (setRoles() for instance). If you fill in a related table name as parameter's name, the typehint will be added to the adder/remover methods (addGroup(), removeGroup() for instance).

You can also specify nullable method signatures (setFoo(Foo $foo = null)):

<parameter name="nullable_columns" value="COLUMN_NAME, RELATED_TABLE_NAME" />


<table name="user">
    <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
    <column name="username" type="varchar" size="255" primaryString="true" />
    <column name="roles" type="array" />

    <behavior name="typehintable">
		<!-- A column -->
        <parameter name="roles" value="array" />
        <!-- A related table -->
		<parameter name="group" value="\FOS\UserBundle\Model\GroupInterface" />

<table name="group">
	<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
	<column name="name" type="varchar" size="255" required="true" primaryString="true" />

<table name="user_group" isCrossRef="true">
	<column name="user_id" type="integer" required="true" primaryKey="true" />
	<column name="group_id" type="integer" required="true" primaryKey="true" />

	<foreign-key foreignTable="user">
		<reference local="user_id" foreign="id" />

	<foreign-key foreignTable="group">
		<reference local="group_id" foreign="id" />

It will generate the following code in the BaseUser class:


use FOS\UserBundle\Model\GroupInterface;

// ...

public function setRoles(array $v)
    if ($this->roles_unserialized !== $v) {
        $this->roles_unserialized = $v;
        $this->roles = '| ' . implode(' | ', $v) . ' |';
        $this->modifiedColumns[] = UserPeer::ROLES;

    return $this;

public function addGroup(GroupInterface $group)
    if ($this->collGroups === null) {
    if (!$this->collGroups->contains($group)) { // only add it if the **same** object is not already associated

        $this->collGroups[]= $group;


William Durand