Codeigniter Rotalar regex - kontrolörü / yöntem adları tire kullanarak

7 Cevap php

Ben gerçek çizili denetleyici ve yöntem adları için rota kesik denetleyici ve yöntem adları için bir hat rotası arıyorum.

Örneğin URL

/controller-name/method-name-which-is-long/

rota olur

/controller_name/method_name_which_is_long/

Bak: sormak için bana fikir verdi http://codeigniter.com/forums/viewreply/696690/ ki :)

7 Cevap

Bu da tam olarak benim gerekliliktir ve ben gibi yolları kullanarak edildi

$route['logued/presse-access'] = "logued/presse_access";

Benim önceki projede ben 300-400 yönlendirme kuralları oluşturmak için gerekli, çoğu dönüşüm altını çizgi kaynaklanmaktadır.

Benim sonraki proje için hevesle bunu önlemek istiyoruz. Ben, benim için çalışma bazı hızlı kesmek yapılır ve bu test olsa herhangi bir canlı sunucu kullanmamışlardır. Aşağıdakileri yapın ..

Aşağıdaki gibi subclass_prefix system / application / config / config.php olduğundan emin olun

$config['subclass_prefix'] = 'MY_';

Sonra sistem / uygulama / kütüphaneleri dizininde MY_Router.php adlı bir dosya yükleyin.

<?php

class MY_Router extends CI_Router { 
    function set_class($class) 
    {
        //$this->class = $class;
        $this->class = str_replace('-', '_', $class);
        //echo 'class:'.$this->class;
    }

    function set_method($method) 
    {
//      $this->method = $method;
        $this->method = str_replace('-', '_', $method);
    }

    function _validate_request($segments)
    {
        // Does the requested controller exist in the root folder?
        if (file_exists(APPPATH.'controllers/'.str_replace('-', '_', $segments[0]).EXT))
        {
            return $segments;
        }
        // Is the controller in a sub-folder?
        if (is_dir(APPPATH.'controllers/'.$segments[0]))
        {       
            // Set the directory and remove it from the segment array
            $this->set_directory($segments[0]);
            $segments = array_slice($segments, 1);

            if (count($segments) > 0)
            {
                // Does the requested controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().str_replace('-', '_', $segments[0]).EXT))
                {
                    show_404($this->fetch_directory().$segments[0]);
                }
            }
            else
            {
                $this->set_class($this->default_controller);
                $this->set_method('index');

                // Does the default controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
                {
                    $this->directory = '';
                    return array();
                }

            }

            return $segments;
        }

        // Can't find the requested controller...
        show_404($segments[0]);
    }
}

Şimdi özgürce http://example.com/logued/presse-access gibi url kullanabilir ve altını otomatik tire dönüştürerek uygun denetleyicisi ve işlevini çağırır.

Edit: Here is our Codeigniter 2 solution which overrides the new CI_Router functions:

<?php

class MY_Router extends CI_Router { 
    function set_class($class) 
    {
        $this->class = str_replace('-', '_', $class);
    }

    function set_method($method) 
    {
        $this->method = str_replace('-', '_', $method);
    }

    function set_directory($dir) {
        $this->directory = $dir.'/';
    }

    function _validate_request($segments)
    {
        if (count($segments) == 0)
        {
            return $segments;
        }

        // Does the requested controller exist in the root folder?
        if (file_exists(APPPATH.'controllers/'.str_replace('-', '_', $segments[0]).'.php'))
        {
            return $segments;
        }

        // Is the controller in a sub-folder?
        if (is_dir(APPPATH.'controllers/'.$segments[0]))
        {
            // Set the directory and remove it from the segment array
            $this->set_directory($segments[0]);
            $segments = array_slice($segments, 1);


            while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))
            {
                // Set the directory and remove it from the segment array
                $this->set_directory($this->directory . $segments[0]);
                $segments = array_slice($segments, 1);
            }

            if (count($segments) > 0)
            {
                // Does the requested controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().str_replace('-', '_', $segments[0]).'.php'))
                {
                    if ( ! empty($this->routes['404_override']))
                    {
                        $x = explode('/', $this->routes['404_override']);

                        $this->set_directory('');
                        $this->set_class($x[0]);
                        $this->set_method(isset($x[1]) ? $x[1] : 'index');

                        return $x;
                    }
                    else
                    {
                        show_404($this->fetch_directory().$segments[0]);
                    }
                }
            }
            else
            {
                // Is the method being specified in the route?
                if (strpos($this->default_controller, '/') !== FALSE)
                {
                    $x = explode('/', $this->default_controller);

                    $this->set_class($x[0]);
                    $this->set_method($x[1]);
                }
                else
                {
                    $this->set_class($this->default_controller);
                    $this->set_method('index');
                }

                // Does the default controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.'.php'))
                {
                    $this->directory = '';
                    return array();
                }

            }

            return $segments;
        }


        // If we've gotten this far it means that the URI does not correlate to a valid
        // controller class.  We will now see if there is an override
        if ( ! empty($this->routes['404_override']))
        {
            $x = explode('/', $this->routes['404_override']);

            $this->set_class($x[0]);
            $this->set_method(isset($x[1]) ? $x[1] : 'index');

            return $x;
        }


        // Nothing else to do at this point but show a 404
        show_404($segments[0]);
    }
}

Şimdi bir uygulama / çekirdek / MY_Router.php gibi bu dosyayı yerleştirmek ve o subclass_prefix olduğundan emin olmak için vardır $config['subclass_prefix'] = 'MY_'; olarak application / config / config.php olarak tanımlanır

Kod birkaç ekstra satır yöntemi eklenmiştir _validate_request():

while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))
{
    // Set the directory and remove it from the segment array
    $this->set_directory($this->directory . $segments[0]);
    $segments = array_slice($segments, 1);
}

Bir normalde biz kontrolörleri klasörün içindeki tek katlı alt dizini kullanabilirsiniz ise, kontrolörler dizin içinde çok düzeyli alt dizinine yararlanabilir ve url çağırabilirsiniz böylece kullanılır. Gerekli değil eğer biri bu kodu kaldırabilirsiniz ama normal bir akış üzerinde hiçbir zararı yoktur.

Sadece CodeIgniter 2 yükselttikten sonra bu soruya geliyor. İşte CodeIgniter çekirdek güncellemeleri hayatta çünkü kabul edilen yanıt daha sağlam bir çözümdür.

<?php
class MY_Router extends CI_Router
{ 
    public function set_class($class) 
    {
        parent::set_class($this->_repl($class));
    }

    public function set_method($method) 
    {
        parent::set_method($this->_repl($method));
    }

    public function _validate_request($segments)
    {
        if (isset($segments[0]))
            $segments[0] = $this->_repl($segments[0]);
        if (isset($segments[1]))
            $segments[1] = $this->_repl($segments[1]);

        return parent::_validate_request($segments);
    }

    private function _repl($s)
    {
        return str_replace('-', '_', $s);
    }
}

Bu application/core/MY_Router.php olarak kaydedilmiş olmalıdır. Şimdi, böyle Abc_Def (dosyasındaki abc_def.php) olarak onları çizgi ile Kontrolör ve Yöntem adları ve URL ile onlara başvurabilirsiniz /abc-def.

<?php
class MY_Router extends CI_Router
{
 function _set_request($segments = array()) {
  parent::_set_request(str_replace('-', '_', $segments));
 }
}
?>

Put this file MY_Router.php inside /application/libraries (CI1) or /application/core (CI2) Remember that this will effect all segments, not only module, controller and method.

Alternative to this extend is to add each segment to router.php $route['this-is-a-module-or-controler'] = 'this_is_a_module_or_controller';

Gördüğünüz gibi uzatmak yöntemi kullanmak daha kolay olacaktır. Sen diğer kesimleriyle _ değiştirme ile etkilenmez böylece fonksiyonu da sadece ilk iki ya da üç segment işlemek yapmak için seçebilirsiniz.

Ben ne arıyorsun bir ön sistem ya da başka bir ön-denetleyici hook istenen URI almak ve güncellemek olacaktır inanıyorum.

Bu eski bir soru ama ben e-mike bu soruna harika bir çözüm olduğunu göndermek istiyorum, ve bir çok basit.

<?php
    public function _set_request($segments){
        // Fix only the first 2 segments
        for($i = 0; $i < 2; ++$i){
            if(isset($segments[$i])){
                $segments[$i] = str_replace('-', '_', $segments[$i]);
            }
        }

        // Run the original _set_request method now, giving it our newly replaced segments
        parent::_set_request($segments);
    }
?>

Bu sorunu bir başkasının yardımcı olur umarım.

Ben size bir rota ile bunu yapabilir emin değilim ...

Ancak, bir yerde Codeigniter çekirdek kütüphane (muhtemelen Router veya URI) bir CamelCase sınıf adı içine çizili URI'lere dönüştüren şey olacak.

Ben hızlı bir göz vardı ve onu bulamadı, ancak bunu yaparsanız, sadece uygulama / kütüphaneleri klasörüne o kütüphaneyi kopyalayın ve orada değiştirin.

Bir "ön-sistem" kanca kaydederek _ ile - Router sınıfını geçersiz kılma yerine bir yolu da var, güzel bir yaklaşımdır.

Öncelikle, 'config / hooks.php' dosyasına şu satırları ekleyerek kanca oluşturun:

$hook['pre_system'] = array(
    'class'    => '',
    'function' => 'prettyurls',
    'filename' => 'myhooks.php',
    'filepath' => 'hooks',
    'params'   => array()
); 

Şimdi 'application / kancalarının klasör içinde bir' myhooks.php 'dosyası oluşturun ve (bu ilk kanca ise bir PHP etiketi açmayı unutmayın) bu fonksiyonu ekleyin:

<?php
function prettyurls() {
    if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '') {
        $newkey = str_replace('-','_',key($_GET));
        $_GET[$newkey] = $_GET[key($_GET)];
        unset($_GET[key($_GET)]);
    }
    if (isset($_SERVER['PATH_INFO'])) $_SERVER['PATH_INFO'] = str_replace('-','_',$_SERVER['PATH_INFO']);
    if (isset($_SERVER['QUERY_STRING'])) $_SERVER['QUERY_STRING'] = str_replace('-','_',$_SERVER['QUERY_STRING']);
    if (isset($_SERVER['ORIG_PATH_INFO'])) $_SERVER['ORIG_PATH_INFO'] = str_replace('-','_',$_SERVER['ORIG_PATH_INFO']);
    if (isset($_SERVER['REQUEST_URI'])) $_SERVER['REQUEST_URI'] = str_replace('-','_',$_SERVER['REQUEST_URI']);
} 

Muhtemelen (benim için hat 91 civarında) kancaları etkinleştirmek için 'config / config.php' dosyasını düzenlemek gerekir:

$config['enable_hooks'] = TRUE; 

Bu cevap http://codeigniter.com/forums/viewthread/124396/#644012 yırtık