OverviewObjectiveLearn how to use the intercepting filter design pattern.RequirementsArrayExtending an ObjectEstimated Time10 minutes www.prodigyview.com
Follow Along With Code Example1. Download a copy of the example code at www.prodigyview.com/source.2. Install the system in an environment you feel comfortable testing in.3. Proceed to examples/design/Filters.php
What are Filters?Intercepting Filters is a design pattern that wraps executionand intercepts the transmissions and/or request ofresponse. Intercepting filters can be stacked in a chain andalter execution without changing the source code.A simpler explanation would be modifying the data that ispassed into or returned from a method. This may alsopossibly affect the execution of that method without directlyaltering the source code.
Intercepting Filters VisualMyObject::doSomething($mydata); My Filter Object Filter passes data to another object to filter Filter is reached Filter Data Continue Execution Output
PVPatterns and PVStaticPatternsThe classes that contain the functions for using filters is thePVPatterns and PVStaticPatterns classes.PVPatterns is for instances and PVStaticPatterns is for staticmethods.Both PVObject and PVStaticObject extend the pattern classes.
Vending Machine Example We are going to start off with a vending machine example. Our VendingMachine extends PVObject. PVObject extends PVPatterns which has the filter methods we need.Extending PVObjectCompile the data tofilterMake the methodfilterable by addingthe filters
Adding A Filter If you noticed in our filter class, we had an explicit section where the filters are were defined. Checks if there is a filter for this class and this methodApply the filter for this class and this method Executes only if the event type has been set Filters are suppose to be tied to a specific function in a specific class. We can simply use get_class and __Function__ to get the current class and function. The method _hasFitler first determines if they method has any filters. If true, lets execute them. The function has two different filters because there are two different events being performed, a check and a selection. The filter is being applied by passing in the class name, the function name, the data to be filtered, and options. Keep in mind that the filter can only filter one piece of data.
Item Check Now for our vending we have items like beer which need to be checked before buying. Lets add in a class that handles that. Options passed about the filter Data passed from the filterReturn the data
Item Chooser Soda sounds generic. What kind of soda? Next we are going to add a class to handle what kind of item we are picking. Options passedData passed from about the filterthe filter Return the data
Vend! Round 1So we have our vending machine set up. Lets run thefunction with some data and look at the results. Rememberthe parameters was item, money and age.
Round 1 ResultsOh man, that’s not good. We are having minors gettingbeer and anyone putting any price and getting what theywant. And all the items are generic! Let’s fix this.
Round 2- Add Some filters So let’s add some filters in. The first two arguments is the class and method to tie the filter too. The second two arguments is the class and method that will do the filtering. The last in the options in which you can tie the filter being called to a particular event. Let’s give this a try. Filter works only onThe class to attach the filter to The method to filter this eventThe class that will filter the data The method in the class to filter the data
Round 2 ResultsOk a little better, at least we are getting some none genericitems back. But we still need to verify the age and amounttendered.
Round 3 – Verification FiltersNow we are going to add the last set filters on, the sameway we added the previous filters. Calls an instance
Round 3 ResultFinally, the results we need. So that is filters in a nutshell.We modified the data in the method without ever modifyingthe method.
Challenge!Below is an optional challenge designed to help you gain abetter understanding of the design pattern.1. Create 3 classes with 2 methods each. Make sure each method accepts 2 parameters and has at least one filter.2. Attach a filter to each method that filters out by calling a filter from another class.3. Design the filters in a way THAT DOES NOT CAUSE AN INFINITE LOOP.4. Execute code.
Summary1. Apply a filter using the _applyFilter method. The name of the class and the name of the function calling the filter should be used. The function only accepts 1 parameter for data to be filters.2. Add a filter before execution using the _addFilter method. Specify the class and method to be filter and the class and method to run the filter through.
API ReferenceFor a better understanding of the Collections and theIterator, check out the api at the two links below.PVStaticPatternsPVPatterns More TutorialsFor more tutorials, please visit:http://www.prodigyview.com/tutorials www.prodigyview.com