Что я должен сделать с Kohana 3, чтобы сделать дежин действия по маршрутам, чтобы перейти на подчеркивание?

StackOverflow https://stackoverflow.com/questions/4221032

  •  26-09-2019
  •  | 
  •  

Вопрос

Рассмотрим этот маршрут в bootstrap.php...

Route::set('crud', 'staff/<controller>(/<action>(/<id>))', array(
            'controller' => '(activities|users|default-emails)',
            'action' => '(new|view|modify|delete)',
            'id' => '\d+'
    ))->defaults(array(
        'directory' => 'staff',
        'action' => 'view'
    ));

То default-emails пытается запустить action_default-emails() Метод, который, очевидно, и не может существовать.

Какую часть Коханы я должен продлиться на карту, чтобы дефис в подчеркиваю внутренне?

Должен ли я быть обеспокоен тем, что если я сделаю это, то он будет доступен через оба _ а также - Разделите маршруты?

Спасибо.

Это было полезно?

Решение

Самый простой - взломать Kohana_Request::execute()@1112

$class->getMethod('action_'.$action)->invokeArgs($controller, $this->_params);

изменить

$class->getMethod('action_'.str_replace('-', '_', $action))->invokeArgs($controller, $this->_params);

Но вы понимаете, что вы должны сделать этот патч в каждой следующей версии Kohana.

Более безобидно может быть продлен Kohana_Route::matches()

class Route extends Kohana_Route
{
    public function matches($uri)
    {
        $matches = parent::matches($uri);
        if (isset($matches['action']))
        {
            $matches['action'] = str_replace('-', '_', $matches['action'];
        }
        return $matches;
    }
}

Не проверил, но держу пари, что он должен работать.

Другие советы

Мое решение для Kohana 3.2 для маршрутизации дефированных действий к соответствующему подчеркнутому методу:
Продлить kohana_rooute и вставьте этот код

if($key == 'action')
{
    $params[$key] = str_replace('-','_',$value);
}
else
{
    $params[$key] = $value;
}

Полное решение: Создайте файл Trame.php в приложении / классах /

<?php defined('SYSPATH') or die('No direct script access.');

class Route extends Kohana_Route
{
    public function matches($uri)
    {
        if ($this->_callback)
        {
            $closure = $this->_callback;
            $params = call_user_func($closure, $uri);

            if ( ! is_array($params))
                return FALSE;
        }
        else
        {
            if ( ! preg_match($this->_route_regex, $uri, $matches))
                return FALSE;

            $params = array();
            foreach ($matches as $key => $value)
            {
                if (is_int($key))
                {
                    // Skip all unnamed keys
                    continue;
                }

                // Set the value for all matched keys
                                if($key == 'action')
                                {
                                    $params[$key] = str_replace('-','_',$value);
                                }
                                else
                                {
                                    $params[$key] = $value;
                                }
            }
        }

        foreach ($this->_defaults as $key => $value)
        {
            if ( ! isset($params[$key]) OR $params[$key] === '')
            {
                // Set default values for any key that was not matched
                $params[$key] = $value;
            }
        }

        return $params;
    }
}

Поскольку Кохана 3.3 вышел, этот метод больше не работает. Я нашел решение, что до сих пор работает для меня.

При обновлении до 3.3 вам не нужно редактировать файл запроса internal.php. Вместо этого вы можете создать маршрутный фильтр. Все, что вам нужно сделать, это заменить дефис в действие в подчеркивание.

Route::set('default', '(<controller>(/<action>(/<id>)))')
    ->filter(function($route, $params, $request) {
        // Replacing the hyphens for underscores.
        $params['action'] = str_replace('-', '_', $params['action']);
        return $params; // Returning an array will replace the parameters.
    })
    ->defaults(array(
         'controller' => 'welcome',
         'action'     => 'index',
    ));

Это, очевидно, работает только для методов. Однако, если вы изучите немного дальше, вы можете создать лучшую функцию для каталога, контроллера и т. Д.

Обновление метода Zerkms. В Кохана 3.2., вам нужно редактировать файл system/classes/kohana/request/client/internal.php линия 106..

Заменять:

$action = $request->action();

К:

$action = str_replace('-', '_', $request->action());

Мне не нравится взломанные рамки, но это безусловно, самое простое и самое надежное решение. Переименование действия в классе маршрута может привести к тому, что действие будет то, что когда-то будет называться my_action (внутренне) и когда-нибудь моим действием (по ссылкам).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top