11.
Custom Alice Faker Function
Keep on Learning!
If you liked what you've learned so far, dive in! Subscribe to get access to this tutorial plus video, code and script downloads.
If you liked what you've learned so far, dive in! Subscribe to get access to this tutorial plus video, code and script downloads.
Whoops, an error! Please, try again later.
24 Comments
hey mate. Thanks alot for this video series, its really great! during the very last step after i add the private $isPublished colums, i add the setter public function setIsPublished($isPublished). wehn i run the php bin/console doctrine:fixtures:load command i get the following error.
PS D:\xampp\htdocs\aqua_note> php bin/console doctrine:fixtures:load
Careful, database will be purged. Do you want to continue y/N ?y
> purging database
> loading AppBundle\DataFixtures\ORM\LoadFixtures
[Doctrine\DBAL\Exception\NotNullConstraintViolationException]
An exception occurred while executing 'INSERT INTO genus (name, sub_family, species_count, fun_fact, is_published)
VALUES (?, ?, ?, ?, ?)' with params [null, "Culpa consequatur.", 93263, "Accusamus nihil repellat vero omnis volupt
ates id amet et.", 1]:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null
[Doctrine\DBAL\Driver\PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null
[PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null
doctrine:fixtures:load [--fixtures [FIXTURES]] [--append] [--em EM] [--shard SHARD] [--purge-with-truncate] [--multiple-
transactions] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [
-e|--env ENV] [--no-debug] [--] <command>
why does is it trying to make name null at all, we only added that nullable=true stipulation to the $funFact column
also it did not do this until i added the isPublished column, before that it worked fine
Hi back to you mate! :) And thanks for the nice words - I love it!
Ok, the error itself is easy to read, but the cause is not so easy - you are correctly "confused" about why this would suddenly happen :). As you can see by looking at the query, a null value *is* being passed to the name field in the query (this is the "with params [null...]" part).
I can also see the is_published is receiving a value of 1 - which is totally normal. Ok, so why is this happening? Obviously, if you simply added a new isPublished key to the fixtures.yml file, it should *not* be happening - the changes should be unaffected. So, that's the mystery. Here's what I would do: add a var_dump($name) inside your setName() function. If you see the correct value dumped (a string, not null) , then we know that this method is being called (and that the problem is elsewhere). If you see null dumped, we know that we have a problem in fixtures.yml - something is telling Alice to call this with null. If you do *not* see the method called, then the problem is probably also in fixtures.yml - we are missing something that would cause setName to be called. Obviously, this would happen if the "name" key were missing from fixtures.yml, but I'm guessing you checked for that ;).
Anyways, do a little digging and let me know what you find out - I'm happy to help.
Cheers!
This is amazing. This tool will replace my old "O Incrível Enchedor de Linguiça" !!!!
Hey Jonas P.
What tool is that? :)
Hey guys, quick doctrine migration question. Is there a way to specify executing the last created diff? If there are old diffs in my DoctrineMigrations directory and I don't delete them it tries to run those before the latest diff. Is that normal behavior?
Hey Todd,
Quick answer: to know what diff is the latest use: "bin/console doctrine:migrations:latest" which give you YYYYMMDDHHMMSS ID of the latest migration, and then with "bin/console doctrine:migrations:execute YYYYMMDDHHMMSS" execute it.
But seriously, it sounds as normal behavior. You need to understand how migrations work: Doctrine stores all the IDs of executed migrations in your DB, that's how Doctrine know what migrations were executed in your system. So when you add more migrations and run "bin/console doctrine:migrations:migrate", Doctrine look into that table and execute only those which are not in that table yet, i.e. execute fresh migrations which have not been executed yet. But if you want to skip a migration for some reasons, you can do it with "bin/console doctrine:migrations:version YYYYMMDDHHMMSS" - use "--add" or "--delete" options to add the current migration to or delete from the table.
This docs could be useful for you I think: https://symfony.com/doc/mas... . Also, executing "bin/console list doctrine:migrations" will show you available commands and some description about each command - good way to quickly understand capabilities of the bundle.
Cheers!
I need to generate a value that is less than the value faker has generated in another field. If I create a custom provider, how do I pass in the value that faker has created for the other field? i.e
stock: <numberbetween(100,5000)> //Produces 823
reorderQty: <customreorderqty($stock)> //Would return a value less than 823
Thanks
Sorry, I just answered my own question. The above code works, just use a $fieldName to refer to a field value in the same record
Hey Simon,
Glad you got it working so fast :)
Cheers!
Hi Guys. First of all great work; love your tutorials. I was trying to code along using latest Alice version and obviously run into buch of problems. I tried to use there solution, however I couldn't use <i>$this->container</i> inside <em>LoadFixtures.php</em>; duno why :/ So I played with it for couple hours and came up with this:
<strong>1.</strong> I read <a>https://github.com/nelmio/alice/blob/master/doc/customizing-data-generation.md#custom-faker-data-providers</a> and based on docs created my <i>GenusProvider</i> class like this:
If you look carefully, you can see I didn't extend BaseProvider. I tried but it didn't work in my case.
<strong>2.</strong> Then you should:
<blockquote>Then you can add it to the Faker Generator used by Alice by either overriding the NativeLoader::createFakerGenerator() method.</blockquote>
This was the hardest part because in tutorial we don't mess with the loader class. This is where I spent most of the time. My solution is to extend the <i>NativeLoader</i> class like this:
As you can see this the place where all the add-provider-magic happens. I overrode <i>createFakerGenerator</i> method and used new fance <i>GenusProvider</i>
<strong>3. </strong> Now let's go back to original <i>LoadFixtures.php</i>. Instead of using <i>NativeLoader</i> i used my <i>NewNativeLoader</i>. Code looks like this:
I bet there is a better way to solve this; mine just works ;)
Hey Maciek,
Thanks for sharing it with others. Also, keep in mind that we're using "nelmio/alice" of version v2.1 in this tutorial. If you install the latest bundle - it has some BC breaks and its usage may be different than that we're showing in this screencast.
Cheers!
Why is my phpstorm adding comments for the return/parameter type when I create a getter or setter using Code Generation? Abd its only calling the type "mixed". Not boolean, for example even though it's an "isPublished" type format for the name. I see your PHPStorm doesn't produce these php doc type comments. eg
/**
* @param mixed $isPublished
*/
public function setIsPublished($isPublished)
{
$this->isPublished = $isPublished;
}
Hey Richard ,
Well, it depends on PhpStorm version. Btw, do you use
@varnotation for class properties? PhpStorm based on var type, try to generate setter/getter with this code:When you specify var types explicitly, PhpStorm will use it in annotation for setters/getters.
Cheers!
If anyone is using Alice 3.0, you will need to create a GenusProvider class based off https://github.com/nelmio/alice/blob/master/doc/customizing-data-generation.md#custom-faker-data-providers. I stuck it in the same folder as my LoadFixtures.php so it had the namespace
AppBundle\DataFixtures\ORMand dropped thegenus()function in there.You also need to changed
services.ymlto get Alice to pick up the new provider. Under theservices:After that run
./bin/console doctrine:fixtures:loadagain and it should be working OK.Yo Syed!
This is awesome! Thanks for posting this! We're going to use your suggestions here to make an official note that we can add to the tutorial to help others :).
Cheers!
Ok, I've adjusted the services.yml file as above and created the GenusProvider class. However, I'm getting an error.
Tried this:
..and this:
Same result:
Hey!
As Authoritas already mentioned, it's probably best to just stick to Alice 2 for now.
However, I have uploaded my working version to GitHub - https://github.com/sjhuda/knp-aqua_note. Everything should be in the same place as the videos so far, it might be worth comparing my code to what you have.
I just ran it right now and I get
Oh, I also forgot to mention that I switched over to using the service that comes with Alice 3 (as opposed to the NativeLoader class), that might be causing your issue (see my comment on the previous video).
Thanks for sharing it!
We added a note to the script so people don't get confused anymore
Cheers!
I tried your code for Alice 3.1, but it threw strange error.
A "tags" entry must be an array for service "AppBundle\DataFixtures\ORM\GenusProvider" in /home/dd/dd/start/app/config/services.yml. Check your YAML syntax.
Do you have idea how to solve this?
Hey Danijela
How did you define the Provider service? I think you only have to sorround the tags property with `[` `]`
Cheers!
thanks!
Authoritas can check the codes which Authoritas shared on git. its working with Alice 3. just copy the codes from fixtures.yml GenusProvider.php and LoadFixtures.php and paste them urs. and add the service. its working for me
Hey Mesut,
Thanks for confirming that solution works for you, I'm glad to hear it.
Cheers!
Hey Authoritas
I assume you are using Alice 3. That version contains many changes, actually the developers said that it shares nothing to version 2, even the persistent layer was removed
I can advice you to use in addition AliceBundle (hautelook/alice-bundle) so you can persist your objects
I hope it helps you :)
Cheers!
"Houston: no signs of life"
Start the conversation!