Ben mevcut modül / denetleyici / eylemler Zend Framework uygulaması normal çalışma için gerekli, ancak daha sonra bir veritabanı tablosunun üzerinden kullanıcı belirtilen adresler almak ve sayfayı görüntülemek olabilecek bir PageController bilinmeyen bir şey gönderilen herkesi kucaklayan yol var. Ben kullanıcı belirtilen adresler önünde bir kontrolör adı var istemiyordu. PageController yoluyla gitmek istediğim / benim / özel / url değil / sayfa / benim / özel / url. Yani yukarıdaki çözümlerin hiçbiri benim için çalıştı.
Hemen hemen tüm varsayılan davranışı kullanarak ve biraz bu yüzden denetleyici adını verdiği denetleyici dosya varsa normal olarak buna biz yol: Ben Zend_Controller_Router_Route_Module uzanan kadar sona erdi. O yok, o url garip bir özel biri olmalı, bu yüzden bir parametre olarak bozulmamış bütün url ile PageController gönderilen alır.
class UDC_Controller_Router_Route_Catchall extends Zend_Controller_Router_Route_Module
{
private $_catchallController = 'page';
private $_catchallAction = 'index';
private $_paramName = 'name';
//-------------------------------------------------------------------------
/*! \brief takes most of the default behaviour from Zend_Controller_Router_Route_Module
with the following changes:
- if the path includes a valid module, then use it
- if the path includes a valid controller (file_exists) then use that
- otherwise use the catchall
*/
public function match($path, $partial = false)
{
$this->_setRequestKeys();
$values = array();
$params = array();
if (!$partial) {
$path = trim($path, self::URI_DELIMITER);
} else {
$matchedPath = $path;
}
if ($path != '') {
$path = explode(self::URI_DELIMITER, $path);
if ($this->_dispatcher && $this->_dispatcher->isValidModule($path[0])) {
$values[$this->_moduleKey] = array_shift($path);
$this->_moduleValid = true;
}
if (count($path) && !empty($path[0])) {
$module = $this->_moduleValid ? $values[$this->_moduleKey] : $this->_defaults[$this->_moduleKey];
$file = $this->_dispatcher->getControllerDirectory( $module ) . '/' . $this->_dispatcher->formatControllerName( $path[0] ) . '.php';
if (file_exists( $file ))
{
$values[$this->_controllerKey] = array_shift($path);
}
else
{
$values[$this->_controllerKey] = $this->_catchallController;
$values[$this->_actionKey] = $this->_catchallAction;
$params[$this->_paramName] = join( self::URI_DELIMITER, $path );
$path = array();
}
}
if (count($path) && !empty($path[0])) {
$values[$this->_actionKey] = array_shift($path);
}
if ($numSegs = count($path)) {
for ($i = 0; $i < $numSegs; $i = $i + 2) {
$key = urldecode($path[$i]);
$val = isset($path[$i + 1]) ? urldecode($path[$i + 1]) : null;
$params[$key] = (isset($params[$key]) ? (array_merge((array) $params[$key], array($val))): $val);
}
}
}
if ($partial) {
$this->setMatchedPath($matchedPath);
}
$this->_values = $values + $params;
return $this->_values + $this->_defaults;
}
}
Yani benim MemberController / member / login gibi, / member / tercihleri vb, ve diğer kontrolörler irade eklenebilir iyi çalışır. ErrorController hala gereklidir: varolan denetleyicileri üzerinde geçersiz eylemleri yakalar.