Как получить «преобразованное» имя действия для Zend Framework MVC? - PullRequest
0 голосов
/ 24 марта 2011

Я знаю, update-profile-picture переводится в функцию updateProfilePictureAction(). Где происходит преобразование параметра действия? Я хотел бы получить updateProfilePicture в качестве значения, я мог бы написать функцию, но она уже должна быть где-то в библиотеке. При использовании $this->_getParam('action') возвращается update-profile-picture;

    /**
     * Auto call scripts
     * @see Zend_Controller_Action::postDispatch()
     */
    public function postDispatch(){
        $action = $this->_getParam('action',false);
        $method = $action.'Scripts';
        if ($action && method_exists($this, $method))
            $this->$method();
    }

это прекрасно работает для indexAction - indexScripts, но не для updateProfilePictureScripts (ищет update-profile-pictureScripts)

Ответы [ 2 ]

3 голосов
/ 24 марта 2011

Получите это с

$this->getFrontController()->getDispatcher()->formatActionName($this->_getParam('action',null));

Это происходит в

/ Zend / Controller / грузоотправитель / Abstract.php

/**
 * Formats a string into an action name.  This is used to take a raw
 * action name, such as one that would be stored inside a Zend_Controller_Request_Abstract
 * object, and reformat into a proper method name that would be found
 * inside a class extending Zend_Controller_Action.
 *
 * @param string $unformatted
 * @return string
 */
public function formatActionName($unformatted)
{
    $formatted = $this->_formatName($unformatted, true);
    return strtolower(substr($formatted, 0, 1)) . substr($formatted, 1) . 'Action';
}




/**
 * Formats a string from a URI into a PHP-friendly name.
 *
 * By default, replaces words separated by the word separator character(s)
 * with camelCaps. If $isAction is false, it also preserves replaces words
 * separated by the path separation character with an underscore, making
 * the following word Title cased. All non-alphanumeric characters are
 * removed.
 *
 * @param string $unformatted
 * @param boolean $isAction Defaults to false
 * @return string
 */
protected function _formatName($unformatted, $isAction = false)
{
    // preserve directories
    if (!$isAction) {
        $segments = explode($this->getPathDelimiter(), $unformatted);
    } else {
        $segments = (array) $unformatted;
    }

    foreach ($segments as $key => $segment) {
        $segment        = str_replace($this->getWordDelimiter(), ' ', strtolower($segment));
        $segment        = preg_replace('/[^a-z0-9 ]/', '', $segment);
        $segments[$key] = str_replace(' ', '', ucwords($segment));
    }

    return implode('_', $segments);
}
1 голос
/ 24 марта 2011

Посмотрите на Zend_Filter_Inflector: http://framework.zend.com/manual/en/zend.filter.inflector.html

...