mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Merge pull request #1142 from chillu/pulls/remove-auto-controller-routing
API Removed auto-routing of controller name
This commit is contained in:
commit
bb724c43b9
@ -15,12 +15,15 @@ After:
|
|||||||
Director:
|
Director:
|
||||||
rules:
|
rules:
|
||||||
'Security//$Action/$ID/$OtherID': 'Security'
|
'Security//$Action/$ID/$OtherID': 'Security'
|
||||||
'$Controller//$Action/$ID/$OtherID': '*'
|
|
||||||
'api/v1/live': 'VersionedRestfulServer'
|
'api/v1/live': 'VersionedRestfulServer'
|
||||||
'api/v1': 'RestfulServer'
|
'api/v1': 'RestfulServer'
|
||||||
'soap/v1': 'SOAPModelAccess'
|
'soap/v1': 'SOAPModelAccess'
|
||||||
'dev': 'DevelopmentAdmin'
|
'dev': 'DevelopmentAdmin'
|
||||||
'interactive': 'SapphireREPL'
|
'interactive': 'SapphireREPL'
|
||||||
|
'InstallerTest//$Action/$ID/$OtherID': 'InstallerTest'
|
||||||
|
'JSTestRunner//$Action/$ID/$OtherID': 'JSTestRunner'
|
||||||
|
'SapphireInfo//$Action/$ID/$OtherID': 'SapphireInfo'
|
||||||
|
'SapphireREPL//$Action/$ID/$OtherID': 'SapphireREPL'
|
||||||
---
|
---
|
||||||
Name: adminroutes
|
Name: adminroutes
|
||||||
Before: '*'
|
Before: '*'
|
||||||
|
@ -197,6 +197,11 @@ class SapphireTest extends PHPUnit_Framework_TestCase {
|
|||||||
Security::$database_is_ready = null;
|
Security::$database_is_ready = null;
|
||||||
|
|
||||||
$this->originalTheme = SSViewer::current_theme();
|
$this->originalTheme = SSViewer::current_theme();
|
||||||
|
|
||||||
|
// Add controller-name auto-routing
|
||||||
|
Config::inst()->update('Director', 'rules', array(
|
||||||
|
'$Controller//$Action/$ID/$OtherID' => '*'
|
||||||
|
));
|
||||||
|
|
||||||
if(class_exists('SiteTree')) {
|
if(class_exists('SiteTree')) {
|
||||||
// Save nested_urls state, so we can restore it later
|
// Save nested_urls state, so we can restore it later
|
||||||
|
@ -1,11 +1,63 @@
|
|||||||
# 3.2.0 (unreleased)
|
# 3.2.0 (unreleased)
|
||||||
|
|
||||||
## Overview ##
|
## Overview
|
||||||
|
|
||||||
### CMS ###
|
### CMS
|
||||||
|
|
||||||
* Moved SS_Report and ReportAdmin out to a separate module. If you're using
|
* Moved SS_Report and ReportAdmin out to a separate module. If you're using
|
||||||
composer or downloading a release, this module should be included for you.
|
composer or downloading a release, this module should be included for you.
|
||||||
Otherwise, you'll need to include the module yourself
|
Otherwise, you'll need to include the module yourself
|
||||||
(https://github.com/silverstripe-labs/silverstripe-reports)
|
(https://github.com/silverstripe-labs/silverstripe-reports)
|
||||||
|
|
||||||
|
### Framework
|
||||||
|
|
||||||
|
* API: Removed URL routing by controller name
|
||||||
|
|
||||||
|
## Details
|
||||||
|
|
||||||
|
### API: Removed URL routing by controller name
|
||||||
|
|
||||||
|
The auto-routing of controller class names to URL endpoints
|
||||||
|
has been removed (rule: `'$Controller//$Action/$ID/$OtherID': '*'`).
|
||||||
|
This increases clarity in routing since it makes URL entpoints explicit,
|
||||||
|
and thereby simplifies system and security reviews.
|
||||||
|
|
||||||
|
Please access any custom controllers exclusively through self-defined
|
||||||
|
[routes](/reference/director). For controllers extending `Page_Controller`,
|
||||||
|
simply use the provided page URLs.
|
||||||
|
|
||||||
|
:::php
|
||||||
|
class MyController extends Controller {
|
||||||
|
static $allowed_actions = array('myaction');
|
||||||
|
public function myaction($request) {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Create a new file `mysite/_config/routes.yml`
|
||||||
|
(read more about the [config format](/topics/configuration)).
|
||||||
|
Your controller is now available on `http://yourdomain.com/my-controller-endpoint`,
|
||||||
|
after refreshing the configuration cache through `?flush=all`.
|
||||||
|
|
||||||
|
:::yaml
|
||||||
|
---
|
||||||
|
Name: my-routes
|
||||||
|
After: framework/routes#coreroutes
|
||||||
|
---
|
||||||
|
Director:
|
||||||
|
rules:
|
||||||
|
'my-controller-endpoint//$Action' : 'MyController'
|
||||||
|
|
||||||
|
|
||||||
|
The auto-routing is still in place for unit tests,
|
||||||
|
since its a frequently used feature there. Although we advise against it,
|
||||||
|
you can reinstate the old behaviour through a director rule:
|
||||||
|
|
||||||
|
:::yaml
|
||||||
|
---
|
||||||
|
Name: my-routes
|
||||||
|
After: framework/routes#coreroutes
|
||||||
|
---
|
||||||
|
Director:
|
||||||
|
rules:
|
||||||
|
'$Controller//$Action/$ID/$OtherID': '*'
|
@ -63,7 +63,10 @@ below the search form on the left.
|
|||||||
|
|
||||||
## Import through a custom controller
|
## Import through a custom controller
|
||||||
|
|
||||||
You can have more customized logic and interface feedback through a custom controller. Let's create a simple upload form (which is used for `MyDataObject` instances). You can access it through `http://localhost/MyController/?flush=all`.
|
You can have more customized logic and interface feedback through a custom controller.
|
||||||
|
Let's create a simple upload form (which is used for `MyDataObject` instances).
|
||||||
|
You'll need to add a route to your controller to make it accessible via URL
|
||||||
|
(see [director](/reference/director)).
|
||||||
|
|
||||||
:::php
|
:::php
|
||||||
<?php
|
<?php
|
||||||
|
@ -408,7 +408,7 @@ HTML
|
|||||||
|
|
||||||
:::ss
|
:::ss
|
||||||
<form action"#">
|
<form action"#">
|
||||||
<div class="autocomplete {url:'MyController/autocomplete'}">
|
<div class="autocomplete {url:'my-controller-route/autocomplete'}">
|
||||||
<input type="text" name="title" />
|
<input type="text" name="title" />
|
||||||
<div class="results" style="display: none;">
|
<div class="results" style="display: none;">
|
||||||
</div>
|
</div>
|
||||||
|
@ -5,7 +5,35 @@
|
|||||||
* We've set up a simple URL handling model based on
|
* We've set up a simple URL handling model based on
|
||||||
*/
|
*/
|
||||||
class RequestHandlingTest extends FunctionalTest {
|
class RequestHandlingTest extends FunctionalTest {
|
||||||
|
|
||||||
static $fixture_file = null;
|
static $fixture_file = null;
|
||||||
|
|
||||||
|
public function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
Config::inst()->update('Director', 'rules', array(
|
||||||
|
// If we don't request any variables, then the whole URL will get shifted off. This is fine, but it means that the
|
||||||
|
// controller will have to parse the Action from the URL itself.
|
||||||
|
'testGoodBase1' => "RequestHandlingTest_Controller",
|
||||||
|
|
||||||
|
// The double-slash indicates how much of the URL should be shifted off the stack. This is important for dealing
|
||||||
|
// with nested request handlers appropriately.
|
||||||
|
'testGoodBase2//$Action/$ID/$OtherID' => "RequestHandlingTest_Controller",
|
||||||
|
|
||||||
|
// By default, the entire URL will be shifted off. This creates a bit of backward-incompatability, but makes the
|
||||||
|
// URL rules much more explicit.
|
||||||
|
'testBadBase/$Action/$ID/$OtherID' => "RequestHandlingTest_Controller",
|
||||||
|
|
||||||
|
// Rules with an extension always default to the index() action
|
||||||
|
'testBaseWithExtension/virtualfile.xml' => "RequestHandlingTest_Controller",
|
||||||
|
|
||||||
|
// Without the extension, the methodname should be matched
|
||||||
|
'testBaseWithExtension//$Action/$ID/$OtherID' => "RequestHandlingTest_Controller",
|
||||||
|
|
||||||
|
// Test nested base
|
||||||
|
'testParentBase/testChildBase//$Action/$ID/$OtherID' => "RequestHandlingTest_Controller",
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
// public function testRequestHandlerChainingLatestParams() {
|
// public function testRequestHandlerChainingLatestParams() {
|
||||||
// $c = new RequestHandlingTest_Controller();
|
// $c = new RequestHandlingTest_Controller();
|
||||||
@ -261,32 +289,6 @@ class RequestHandlingTest extends FunctionalTest {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Director rules for the test
|
|
||||||
*/
|
|
||||||
Config::inst()->update('Director', 'rules', array(
|
|
||||||
// If we don't request any variables, then the whole URL will get shifted off. This is fine, but it means that the
|
|
||||||
// controller will have to parse the Action from the URL itself.
|
|
||||||
'testGoodBase1' => "RequestHandlingTest_Controller",
|
|
||||||
|
|
||||||
// The double-slash indicates how much of the URL should be shifted off the stack. This is important for dealing
|
|
||||||
// with nested request handlers appropriately.
|
|
||||||
'testGoodBase2//$Action/$ID/$OtherID' => "RequestHandlingTest_Controller",
|
|
||||||
|
|
||||||
// By default, the entire URL will be shifted off. This creates a bit of backward-incompatability, but makes the
|
|
||||||
// URL rules much more explicit.
|
|
||||||
'testBadBase/$Action/$ID/$OtherID' => "RequestHandlingTest_Controller",
|
|
||||||
|
|
||||||
// Rules with an extension always default to the index() action
|
|
||||||
'testBaseWithExtension/virtualfile.xml' => "RequestHandlingTest_Controller",
|
|
||||||
|
|
||||||
// Without the extension, the methodname should be matched
|
|
||||||
'testBaseWithExtension//$Action/$ID/$OtherID' => "RequestHandlingTest_Controller",
|
|
||||||
|
|
||||||
// Test nested base
|
|
||||||
'testParentBase/testChildBase//$Action/$ID/$OtherID' => "RequestHandlingTest_Controller",
|
|
||||||
));
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controller for the test
|
* Controller for the test
|
||||||
*/
|
*/
|
||||||
|
@ -11,6 +11,14 @@ class FormTest extends FunctionalTest {
|
|||||||
'FormTest_Player',
|
'FormTest_Player',
|
||||||
'FormTest_Team',
|
'FormTest_Team',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
Config::inst()->update('Director', 'rules', array(
|
||||||
|
'FormTest_Controller' => 'FormTest_Controller'
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
public function testLoadDataFromRequest() {
|
public function testLoadDataFromRequest() {
|
||||||
$form = new Form(
|
$form = new Form(
|
||||||
@ -536,9 +544,4 @@ class FormTest_ControllerWithSecurityToken extends Controller implements TestOnl
|
|||||||
public function getViewer($action = null) {
|
public function getViewer($action = null) {
|
||||||
return new SSViewer('BlankPage');
|
return new SSViewer('BlankPage');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Config::inst()->update('Director', 'rules', array(
|
|
||||||
'FormTest_Controller' => 'FormTest_Controller'
|
|
||||||
));
|
|
||||||
|
|
@ -327,7 +327,7 @@ class GridFieldDetailFormTest_Controller extends Controller implements TestOnly
|
|||||||
|
|
||||||
class GridFieldDetailFormTest_GroupController extends Controller implements TestOnly {
|
class GridFieldDetailFormTest_GroupController extends Controller implements TestOnly {
|
||||||
protected $template = 'BlankPage';
|
protected $template = 'BlankPage';
|
||||||
|
|
||||||
public function Form() {
|
public function Form() {
|
||||||
$field = new GridField('testfield', 'testfield', GridFieldDetailFormTest_PeopleGroup::get()->sort('Name'));
|
$field = new GridField('testfield', 'testfield', GridFieldDetailFormTest_PeopleGroup::get()->sort('Name'));
|
||||||
$field->getConfig()->addComponent($gridFieldForm = new GridFieldDetailForm($this, 'Form'));
|
$field->getConfig()->addComponent($gridFieldForm = new GridFieldDetailForm($this, 'Form'));
|
||||||
|
Loading…
Reference in New Issue
Block a user