2013-10-17 77 views
0

我有一個ZF2應用程序與幾個模塊及其路線。一切都很好。但是我想定製URL的創建方式,而不必重寫所有的視圖。ZF2修改URL格式

讓考慮以下路線:

'routes' => array(
    'moduleName' => array(
     'type' => 'segment', 
     'options' => array(
      'route' => '/moduleName/[:title]-[:id][/:action] 
      'constraints' => array(
       'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
       'id'  => '[0-9]+', 
      ), 
      'defaults' => array(
       'controller' => 'moduleName\Controller\moduleName', 
       'action'  => 'index', 
      ), 
     ), 
    ), 

我穿上「標題」沒有任何限制,因爲它可以包含歐洲特殊字符和/或空格的字符串。 的網址http://domain/moduleName/J'ustAn éxample-28/create工作正常,但我想這是正確的格式:http://domain/moduleName/j-ustan-example-28/create

有沒有辦法在我的配置文件中很好地? Module.php的?甚至「更高」?

編輯 我試圖建立一個新的URL助手(基於這個問題Extending Zend\View\Helper\Url in Zend Framework 2):

namespace Application\View\Helper; 

use Zend\View\Helper\Url as ZendUrl; 

class Url extends ZendUrl { 

    public function __invoke($name = null, array $params = array(), $options = array(), $reuseMatchedParams = false) { 
     foreach($params as $param => $value) { 
      $params[$param] = $this->cleanString($value); 
     } 
     $link = parent::__invoke($name, $params, $options, $reuseMatchedParams); 
     return $link; 
    } 

    public function cleanString($string) { 
     $string = str_replace(array('[\', \']'), '', $string); 
     $string = preg_replace('/\[.*\]/U', '', $string); 
     $string = preg_replace('/&(amp;)?#?[a-z0-9]+;/i', '-', $string); 
     $string = htmlentities($string, ENT_COMPAT, 'utf-8'); 
     $string = preg_replace('/&([a-z])(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig|quot|rsquo);/i', '\\1', $string); 
     $string = preg_replace(array('/[^a-z0-9]/i', '/[-]+/') , '-', $string); 
     return strtolower(trim($string, '-')); 
    } 
} 

但我不能使它發揮作用。 我心中已經把這個\應用\ Module.php:

public function getViewHelperConfig() 
{ 
    return array(
     'factories' => array(
      'Application\View\Helper\Url'   => function ($sm) { 
       $serviceLocator = $sm->getServiceLocator(); 
       $view_helper = new \Application\View\Helper\Url(); 
       $router = \Zend\Console\Console::isConsole() ? 'HttpRouter' : 'Router'; 
       $view_helper->setRouter($serviceLocator->get($router)); 

       $match = $serviceLocator->get('application') 
        ->getMvcEvent() 
        ->getRouteMatch(); 

       if ($match instanceof RouteMatch) { 
        $view_helper->setRouteMatch($match); 
       } 

       return $view_helper; 
      } 
     ), 
    ); 
} 

但它不工作,不顯示任何錯誤...

任何想法?

+1

你要接受的網址特別茶然後修改要過濾的參數,或將特殊字符url重定向到轉換後的url? – GeeH

+0

我想過濾params.I試圖建立一個新的URL助手,但無法設法使其工作... – Bibear

回答

0

也許這樣

'title' => '[a-zA-Z][a-zA-Z0-9_-]*', // add this line to your route 

否則當您創建鏈接

function clean($string) { 
    $string = str_replace('', '-', $string); // Replaces all spaces with hyphens. 
    return preg_replace('/[^A-Za-z0-9\-]/', '-', $string); // Removes special chars. 
} 
$title = clean("J'ustAn éxample"); 

生成鏈接

echo $this->url('moduleName', array('title'=>$title,'id'=>28,'action'=>'create')) 

來源:Remove all special characters from a string