Feature #30933

Check for unique constraints on add()

Added by Thomas Hempel almost 4 years ago. Updated 10 months ago.

Status:Needs Feedback Start date:2011-10-14
Priority:Should have Due date:
Assigned To:Karsten Dambekalns % Done:

0%

Category:Persistence
Target version:-
PHP Version: Complexity:
Has patch:No

Description

If you define a uniqueConstraints in a Model you want to have that checked as soon as the add() method of your repository is called. If you don't do that it might lead into some problems later in your controller.

For example you have the following model:

/**
 * @scope prototype
 * @entity
 * @Table(name="acme_demo_domain_model_mymodel", uniqueConstraints={@UniqueConstraint(name="name_idx", columns={"name"})})
 */
class MyModel {
    /**
     * @var string
     */
    protected $name;

    [snip]
}

The propety name has a doctrine unique contraints which means that i can only exists once in the database.

Now you have this controller

class AcmeDemoCommandController extends \TYPO3\FLOW3\MVC\Controller\CommandController {

    /**
     * Add a MyModel
     *
     * Adds a MyModql with a given name
     *
     * @param string $name The name of the repository
     * 
     * @return void
     */
    public function addCommand($name) {
        try {
            $newModelInstance = new \Acme\Demo\Domain\Model\MyModel($name);
            $this->MyModelRepository->add($newModelInstance);
        } catch (\Exception $e) {
            $this->outputLine('The MyModel could not be created!');
            return -1;
        }

        $this->outputLine('New MyModel was created.');
    }

}

On the command line you do the following:

./flow3 AcmeDemo:add foo

This works the first time as expected.

When you execute it the second time, you get an Exception because the name "foo" is already present in the database. You get the Exception even though you put the code in a try catch blog is, this is because the method to actually save the changes is called after your code. The responsible method is persistAll().

This leads to some more problem which I put into a seperate issue. For now let me tell you that it doesn't work.

It would be really cool if the add would return something that tells me if an object can be persisted or not. Otherwise I had to check all my DB constraints manually whenever I work with my model. And if I understood DDD corectly, this is not the Domain of my controller. ;-)


Related issues

related to TYPO3.Flow - Bug #30934: persistAll() should only be called if EntityManager is st... Resolved 2011-10-14
related to TYPO3.Flow - Feature #29547: @identity should make property unique in Database Resolved 2012-04-30
related to TYPO3.Flow - Bug #32823: Make combination of Account identifier and authentication... Resolved 2011-12-23
related to TYPO3.Party - Bug #37266: Duplicate email address throws exception Resolved 2012-05-17

History

#1 Updated by Karsten Dambekalns almost 4 years ago

  • Tracker changed from Suggestion to Feature
  • Project changed from TYPO3 Flow Base Distribution to TYPO3.Flow

#2 Updated by Karsten Dambekalns almost 4 years ago

  • Category set to Persistence

#3 Updated by Christopher Hlubek almost 4 years ago

  • Has patch set to No

This is actually a problem with the FLOW3 persistence approach since some time. At one side it's an advantage to not save the object in "add" and defer it until the end. Otherwise (especially for things like Uniqueness or DB constraints) it fails much too late to respond to this in a nice way.

I wouldn't change the behaviour of add since it allows for a nice caching of operations. But we could make a persistAll() or similar operation more user friendly to provide results for persistence operations object-wise (like results for validations for example).

#4 Updated by Karsten Dambekalns over 3 years ago

Actually moving the validation run from onFlush to prePersist / preUpdate could solve this. Worth a try.

#5 Updated by Gerrit Code Review over 3 years ago

  • Status changed from New to Under Review

Patch set 1 for branch master has been pushed to the review server.
It is available at http://review.typo3.org/8733

#6 Updated by Karsten Dambekalns over 3 years ago

  • Assigned To set to Karsten Dambekalns
  • Target version set to 1.1

#7 Updated by Robert Lemke about 3 years ago

  • Status changed from Under Review to Needs Feedback

#8 Updated by Robert Lemke about 3 years ago

  • Target version deleted (1.1)

#9 Updated by Christian Müller 10 months ago

This change is still relevant and needs to move to jira.

Also available in: Atom PDF