mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2024-11-15 03:18:26 +00:00
add DispatcherFilter Settings
This commit is contained in:
parent
54a65f98da
commit
4639d3597c
4 changed files with 77 additions and 4 deletions
|
@ -80,6 +80,7 @@ Cache::config('default', array('engine' => 'File'));
|
||||||
*
|
*
|
||||||
* Configure::write('Dispatcher.filters', array(
|
* Configure::write('Dispatcher.filters', array(
|
||||||
* 'MyCacheFilter', // will use MyCacheFilter class from the Routing/Filter package in your app.
|
* 'MyCacheFilter', // will use MyCacheFilter class from the Routing/Filter package in your app.
|
||||||
|
* 'MyCacheFilter' => array('prefix' => 'my_cache_'), // will use MyCacheFilter class from the Routing/Filter package in your app with settings array.
|
||||||
* 'MyPlugin.MyFilter', // will use MyFilter class from the Routing/Filter package in MyPlugin plugin.
|
* 'MyPlugin.MyFilter', // will use MyFilter class from the Routing/Filter package in MyPlugin plugin.
|
||||||
* array('callable' => $aFunction, 'on' => 'before', 'priority' => 9), // A valid PHP callback type to be called on beforeDispatch
|
* array('callable' => $aFunction, 'on' => 'before', 'priority' => 9), // A valid PHP callback type to be called on beforeDispatch
|
||||||
* array('callable' => $anotherMethod, 'on' => 'after'), // A valid PHP callback type to be called on afterDispatch
|
* array('callable' => $anotherMethod, 'on' => 'after'), // A valid PHP callback type to be called on afterDispatch
|
||||||
|
|
|
@ -95,7 +95,12 @@ class Dispatcher implements CakeEventListener {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($filters as $filter) {
|
foreach ($filters as $index => $filter) {
|
||||||
|
$settings = array();
|
||||||
|
if (is_array($filter) && !is_int($index)) {
|
||||||
|
$settings = $filter;
|
||||||
|
$filter = $index;
|
||||||
|
}
|
||||||
if (is_string($filter)) {
|
if (is_string($filter)) {
|
||||||
$filter = array('callable' => $filter);
|
$filter = array('callable' => $filter);
|
||||||
}
|
}
|
||||||
|
@ -105,7 +110,7 @@ class Dispatcher implements CakeEventListener {
|
||||||
if (!class_exists($callable)) {
|
if (!class_exists($callable)) {
|
||||||
throw new MissingDispatcherFilterException($callable);
|
throw new MissingDispatcherFilterException($callable);
|
||||||
}
|
}
|
||||||
$manager->attach(new $callable);
|
$manager->attach(new $callable($settings));
|
||||||
} else {
|
} else {
|
||||||
$on = strtolower($filter['on']);
|
$on = strtolower($filter['on']);
|
||||||
$options = array();
|
$options = array();
|
||||||
|
|
|
@ -34,6 +34,22 @@ abstract class DispatcherFilter implements CakeEventListener {
|
||||||
*/
|
*/
|
||||||
public $priority = 10;
|
public $priority = 10;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Settings for this filter
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
public $settings = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param string $setting Configuration settings for the filter.
|
||||||
|
*/
|
||||||
|
public function __construct($settings = array()) {
|
||||||
|
$this->settings = Hash::merge($this->settings, $settings);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the list of events this filter listens to.
|
* Returns the list of events this filter listens to.
|
||||||
* Dispatcher notifies 2 different events `Dispatcher.before` and `Dispatcher.after`.
|
* Dispatcher notifies 2 different events `Dispatcher.before` and `Dispatcher.after`.
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
App::uses('Dispatcher', 'Routing');
|
App::uses('Dispatcher', 'Routing');
|
||||||
|
App::uses('DispatcherFilter', 'Routing');
|
||||||
|
|
||||||
if (!class_exists('AppController', false)) {
|
if (!class_exists('AppController', false)) {
|
||||||
require_once CAKE . 'Test' . DS . 'test_app' . DS . 'Controller' . DS . 'AppController.php';
|
require_once CAKE . 'Test' . DS . 'test_app' . DS . 'Controller' . DS . 'AppController.php';
|
||||||
|
@ -496,6 +497,39 @@ class TimesheetsController extends Controller {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TestFilterDispatcher class
|
||||||
|
*
|
||||||
|
* @package Cake.Test.Case.Routing
|
||||||
|
*/
|
||||||
|
class TestFilterDispatcher extends DispatcherFilter {
|
||||||
|
|
||||||
|
public $priority = 10;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TestFilterDispatcher::beforeDispatch()
|
||||||
|
*
|
||||||
|
* @param mixed $event
|
||||||
|
* @return CakeResponse|boolean
|
||||||
|
*/
|
||||||
|
public function beforeDispatch(CakeEvent $event) {
|
||||||
|
$event->stopPropagation();
|
||||||
|
$response = $event->data['request'];
|
||||||
|
$response->addParams(array('settings' => $this->settings));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TestFilterDispatcher::afterDispatch()
|
||||||
|
*
|
||||||
|
* @param mixed $event
|
||||||
|
* @return mixed boolean to stop the event dispatching or null to continue
|
||||||
|
*/
|
||||||
|
public function afterDispatch(CakeEvent $event) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DispatcherTest class
|
* DispatcherTest class
|
||||||
*
|
*
|
||||||
|
@ -1225,6 +1259,23 @@ class DispatcherTest extends CakeTestCase {
|
||||||
$this->assertNull($dispatcher->controller);
|
$this->assertNull($dispatcher->controller);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that it is possible to attach filter with config classes to the dispatch cycle
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testDispatcherFilterSettings() {
|
||||||
|
Configure::write('Dispatcher.filters', array(
|
||||||
|
'TestFilterDispatcher' => array('service' => 'google.com')
|
||||||
|
));
|
||||||
|
$Dispatcher = new Dispatcher();
|
||||||
|
$url = new CakeRequest('some_pages/index');
|
||||||
|
$response = $this->getMock('CakeResponse');
|
||||||
|
$Dispatcher->dispatch($url, $response, array('return' => 1));
|
||||||
|
$settings = $url->param('settings');
|
||||||
|
$this->assertEquals($settings, array('service' => 'google.com'));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests that attaching an inexistent class as filter will throw an exception
|
* Tests that attaching an inexistent class as filter will throw an exception
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue