I want to execute a function when a road is called it in any controller but before the call to action.
The goal is that the code is invisible in the controller and do it the best walkthrough possible.
Here you have the solution: https://matt.drollette.com/2012/06/calling-a-method-before-every-controller-action-in-symfony2/
In short, you have to intercept the call to a Controller using a Kernel event, and then execute your code inside the listener. You can "select" which controllers use this behavior extending a particular Interface.
Related
Hi I have a question about symfony application architecture,
In my application I create different user, but when a user is created, updated, deleted, or his picture change, I need to do some action.
What is the best way to do this ? I excluded to do this on a controller action. There is 2 others solutions :
Create differents events like user.created, user.updated, ... And dispatch it on the controller action and make different listener to do the different action like MailListener (for user.created) TaskListener (for user.created) for add a task.
Use a service like UserManager and on this service have a method like userCreated() and on this method call differents actions like sendMailOnCreated, addTaskOnCreated for example.
For you what is the best method ?
For me, your first solution is the best one. It's clearly a use case for the Event component. It will be easier to maintain and more readable.
Moreover, if you need to add more listener you just need to create another one and bind it to your event. You don't need to modify your controller anymore.
I have a preUpdate event hook in an event listener and I want to write a test that just verifies that it gets executed when a particular document is updated. The only documentation I've been able to find about testing anything Doctrine-related was about testing query builders. I am new to Doctrine and this seems like a very simple thing to do but I really can't figure it out.
You can use partial mock. Lets say the class that has preUpdate hook is called Entity.
$mock = $this->getMockBuilder('Mock')->setMethods(array('preUpdate'))->getMock();
This create an object for which only the preUpdate method is stubbed and you can write expectations to this method:
$mock->expects($this->once())->method('preUpdate');
// some code that triggers the hook
All other methods of the class will work as in the original class - they would not be overriden
So, here's the rundown...
I've got a master layout page for my MVC 4 app that has some dynamic information and needs to be strongly typed to a specific domain entity to get that information. To keep my files cleaner, I've extracted out the typed fields to a partial view.
To grab the entity I need and map it to the partial's view-model, I have a LayoutController with an action that returns a Task<PartialViewResult>. This action uses a service layer to make an async call out to a Web API project, awaiting the entity. It massages that entity into the view-model and then returns PartialView("_LayoutPartial", viewModel).
From within the _Layout page, the partial is called via:
#{Html.RenderAction("LayoutInfo", "Layout", new { /*entity primary key*/ });}
I've stepped through the code and it does indeed get the correct entity back, but then after returning the partial view task, I get everybody's favorite Server Error page with the following error:
HttpServerUtility.Execute blocked while waiting for an asynchronous operation to complete.
I've done some Googling and SO searching and have no idea what this actually means. Am I thinking through this correctly?
That error message means that you're trying to invoke (and wait on!) an asynchronous method from within a synchronous method. In your specific case, the synchronous method is HtmlHelper.RenderAction, and the asynchronous method is your Task-returning action method. The reason the error occurs is that the point of writing an asynchronous Task-returning method is presumably to avoid blocking a thread, but RenderAction can't return until the Task is complete, so RenderAction ends up blocking while waiting for the operation to finish.
One option is to make the method that RenderAction calls synchronous instead of asynchronous, keeping in mind that this will continue to block the original thread. Another option is to populate the layout data asynchronously from within the original action method, then to pass that via ViewData to the layout page.
In Symfony 2, I have a controller which has many methods, I want to be able to wrap methods within all the methods of the controller, else I would have to manually place the code at the end of each function. Has someone ever implement this in Symfony 2?
If your code concern Response, have a look at kernel.view event.
Ex. https://stackoverflow.com/a/8805462/520114
Otherwise, see other events.
I have a controller that receives an event with some data. As a part of the processing this s new data it needs to modify a collection in another controller. Is it a bad idea to inject a controller into another controller to modify this collection?
I don't really understand what you mean by "a collection in another controller", but IMHO your collection should be in the model. Your first controller modifies the collection in the model which dispatches an event caught by the second controller.
I'm not too familiar with Swiz, however in other frameworks if you needed to have another 'controller' do something after a result, it would dispatch an event that the second controller is listening for giving it the data it needs.