Laravel Capture Query event - php

I'm trying to capture an event when ever the application runs select query.
So lets say i have ProductsModel
and when ever method ProductsModel::all(); runs, i want to fire an event.
I have tried using Observers but it didnt work, the documentation https://laravel.com/docs/5.3/eloquent#events
says it cannot do such thing.
Is there any way I can achieve this using EventListeners or perhaps somehow extending the available events? ?

Related

Symfony - Checking something without method execution

In my Symfony project I have and idea to check for my entity field "created". When the creation date of that date is more into the past than two weeks I want to update that entity with some data.
As this is new functionality for me, I was planing to write a function that with DateTime object that will check that.
Other thing I wanted to ask is, how to do it without firing that specific method? Can it be checked regularly on page load or something like that?
What is the right approach here?
Is it an Event Listener the right thing or am I missing something else?
I would suggest to use Symfony console commands / cronjobs.
You could schedule the command/cronjob to run once every day (or when you need it to).
In your console command you you could get all the articles that have a creation date and are older than your specified date. Use Doctrine Query Language (DQL) for this. I don't think you will need DateTime object for this. You can do it all in DQL
(Optional) If needed, you could dispatch an Event after an entity is updated (or put to expired), and build Listeners to do something extra.

On a laravel app is it possible to have listener called only once, no matter how many times an event is being fired?

I think the title says it all.. In a Laravel app I'm dispatching an event (or events) multiple times in the code and have a subscriber for them, but I want it to process only once, no matter how many times the events are fired in the flow.
Is there any clear way to do that, or I am going to need a ..singleton class or something like that?
Thanks
You could unlisten the event with Event::forget('YourEvent'); in the subscriber after the first dispatch.
The downside is that all other listeners of this event will also be removed.

doctrine: call symfony method based on Entity DateTime age

I'm new to Symfony and Doctrine.
I got a project where I need a method inside a Symfony service to be called with data from the DB whenever a dateTime object saved in that DB table "expires" (reaches a certain (dynamic) age).
As I'm just starting out I do not have any code yet. What I need is a start point to get me looking in the right direction as neither the life cycle callbacks nor the doctrine event listener / dispatcher structure seems to be able to solve this task.
Am I missing something important here or is it maybe just a totally wrong start to my problem which actually can't be solved by doctrine itself?
What came to my mind is a cron-job'ish structure, but that kind of implementation is not as dynamic as required but bound to specific time frames which may be not reactive enough and maybe even immensly decreases the performance in different situations.
If I'm getting your problem right: You want something that executes when a record's datetime expires.
The main problem is that you would have to call PHP based on a DB event which is not straight forward...
One possible solution can be a Symfony command that's executed periodically(using cron) and you select the expired entities and do the required actions.
So as far as I found out doctrine is really not able to do this task in the descriped way. Of course the DB can't react to a part of a record it saved without an external action triggering the lookup.
So what I will propably go with is a shell programm called at.
It actually is something like I (and katon.abel) mentioned. It is able to enter one time crons which are then executed according to the provided time (that I then do not need to save in the DB but just pass it to at).
This way I can easily create the crons via symfony, save the needed data via doctrine and call the callback method via a script triggered by at.

Force doctrine to always refresh

I've got a script that fetches data from a database using doctrine. Sometimes it needs to fetch the data for the same entity, the second time however it uses the identity map and therefor might go out of sync with the database (another process can modify the entities in the db). One solution that we tried was to set the query hint Query::HINT_REFRESH before we run the DQL query. We however would like to use it also with simple findBy(..) calls but that doesn't seem to work? We would also like to be able to set it globally per process so that all the doctrine SELECT queries that are run in that context would actually fetch the entities from the DB. We tried to set the $em->getConfiguration()->setDefaultQueryHint(Query::HINT_REFRESH, true); but again that doesn't seem to work?
Doctrine explicitly warns you that it is not meant to be used without a cache.
However if want to ignore this, then Cerad's comment (also mentioned in in this answer) sound right. If you want to do it on every query though you might look into hooking into a doctrine event, unfortunately there is no event for preLoad, only postLoad, but if you really don't care about performance you could create a postLoad listener which first gets the class and id of the loaded entity, calls clear on the entity manager and finally reloads it. Sounds very wrong to me though, I wash my hands of it :-)

Create Project Log(History) Module in symfony with event dispatchers

I'm developing a project management tool in Symfony, right now I'm creating a module to recording the logs i.e, to capture every event like New project create, task create, task status changes, deletion of projects and task, etc.
I have a log table where I have planned to insert new rows whenever any of the above event occurs. But for doing this, I need to go into each controller and call the log model to execute the insert query. Its almost like I'm going to work on all the actions in the controller again for appending this code. is there any other way to call the model only once using some event dispatcher like class in Symfony.
Glad your are using Propel, there is a bunch of plugins and/or behavior for tracking what happend to your object. I will give you a list of what I've found:
pmPropelObjectLogBehaviorPlugin: Maintains a class changelog (the changes of each instance).
AuditableBehavior: Add ability to log activity for propel objects
propel-listener-behavior: Makes you attach listeners to propel generated objects that inform you about updates on those.
ncPropelChangeLogBehaviorPlugin: a Behavior for Propel objects that allows you to track any changes made to them.
JMSAOPBundle does exactly that.
If I may suggest, I think it's better to add custom events for each action, with this way you can extend your app with more listener without losing control. If you use doctrine you can also work with doctrine event system

Categories