2017-12-26 47 views
2

팔콘 경로에 문제가 있습니다. 나는 코드를 가지고있다 :팔콘 경로 충돌

$router->add('/{aliascat:[0-9\-a-z\-]+}(/?)', array(
'module' => 'frontend', 
'controller' => 'category', 
'action' => 'view', 
'category' => 1, 
'lang' => 'md', 
))->setName('category_view_cpu'); 

$router->add('/{lang:[' . $langsDefined . ']{2}+}/{aliascat:[0-9\-a-z\-]+}(/?)', array(
'module' => 'frontend', 
'controller' => 'category', 
'action' => 'view', 
'category' => 2, 
'lang' => 1, 
))->setName('category_view_cpu'); 

$router->add('/{controller:[a-z]{3,50}+}(/?)', array(
'module' => 'frontend', 
'controller' => 1, 
'action' => 'index', 
'lang' => 'md', 
))->setName('default_module'); 

$router->add('/{lang:[' . $langsDefined . ']{2}+}/{controller:[a-z]{3,50}+}(/?)', array(
'module' => 'frontend', 
'controller' => 2, 
'action' => 'index', 
'lang' => 1, 
))->setName('default_module_lang'); 

$router->add('/{controller:[a-z]{3,50}+}/:action/', array(
'module' => 'frontend', 
'controller' => 1, 
'action' => 2, 
'lang' => 'md', 
))->setName('default_module_controller_action'); 

$router->add('/{lang:[' . $langsDefined . ']{2}+}/{controller:[a-z]{3,50}+}/:action/', array(
'module' => 'frontend', 
'controller' => 2, 
'action' => 3, 
'lang' => 1, 
))->setName('default_module_controller_action_lang'); 


$router->add('/{controller:[a-z]{3,50}+}/:action/:params/', array(
'module' => 'frontend', 
'controller' => 1, 
'action' => 2, 
'params' => 3, 
'lang' => 'md', 
))->setName('default_module_controller_action_params'); 

$router->add('/{lang:[' . $langsDefined . ']{2}+}/{controller:[a-z]{3,50}+}/:action/:params/', array(
'module' => 'frontend', 
'controller' => 2, 
'action' => 3, 
'params' => 4, 
'lang' => 1, 
))->setName('default_module_controller_action_params_lang'); 

default_module 라우트와 충돌하기 때문에 범주 라우트에 대해 정의되지 않은 컨트롤러를 얻는다. 이 문제를 어떻게 해결할 수 있습니까?

내가 경로가/카테고리 이름/ 그리고 기본값 :/컨트롤러/액션/... 경로와

충돌.

1) 먼저, 당신이 그 정규 표현식에 두 개의 하이픈을 필요 없어요 :

답변

0

는 코드를 읽고, 내가 할 수있는 몇 가지 개선 사항을 발견했다. [0-9\-a-z\-] 대신 [0-9a-z\-]을 입력하십시오.

2) 두 개의 반복되는 category_view_cpu 이름이 있음을 알 수 있습니다. 복사하여 붙여 넣은 후에는 반드시 수정해야합니다. ;)

3) 경로의 로직이 너무 넓어서 모호한 결과가 발생합니다. 예를 들어 category_view_cpu 경로 (첫 번째 경로)에 대한 라우팅 정의 및 정규식은 default_module 경로와 매우 유사하게 동작합니다. 따라서 첫 번째 경로에서 영숫자 소문자 문자열 (선택적 하이픈 포함)이 필요하며 default_module 경로에는 최소 3 자 이상의 문자 전용 문자열이 필요합니다. 따라서 yoursite.com/dummy을 입력하면 dummy 부분이 첫 번째 경로와 일치하고 default_module 경로와 일치합니다. Phalcon은 dummy이 컨트롤러인지 또는 카테고리 별칭인지 알 수있는 방법이 없습니다.

경로 그룹을 사용하거나 지정된 컨트롤러에서만 처리되는 특정 경로의 컨트롤러를 지정하여 경로를 너무 넓게 만들지 말 것을 제안합니다. 예를 들면 다음과 같습니다.

$router->add('/categories/{alias:[0-9a-z\-]+}(/?)', array(
'module' => 'frontend', 
'controller' => 'categories', 
'action' => 'view', 
'category' => 1, 
'lang' => 'md', 
))->setName('category_view_cpu'); 

그런 다음이 경로^아래에서 다른 모든 요청을 잡을 일반/기본 경로를 정의 할 수 있습니다. 예 :

$router->add('/{controller:[a-z]{3,50}+}(/?)', array(
'module' => 'frontend', 
'controller' => 1, 
'action' => 'index', 
'lang' => 'md', 
))->setName('default_module'); 

무엇이 예에 일어날 것은 Phalcon가 /categories 같은 URL을 얻는 경우에, 그것은 내가 만든 첫 번째 경로와 일치합니다 점이다. 그러나 그것이 /dummy과 같은 경로를 얻는다면, 그것은 첫 번째 경로와 일치하지 않을 것이지만 두 번째 경로와 일치 할 것입니다.

라우팅 그룹은 라우팅 논리를 구별하고 구분하는 데 유용합니다. 나는 당신이 완전히 그것을 읽는 것이 좋습니다 : https://docs.phalconphp.com/en/3.2/routing#defining-groups-of-routes

+0

하지만 나는 카테고리에 대한 URL을 설정해야합니다 : site.com/category_name/ 기본 경로로 어떻게 할 수 있습니까? – Jajaja

+0

내 게시물을 다시 읽으십시오. 특히 "경로에 대한 논리가 너무 넓어서 모호함이 생깁니다"라는 부분을 다시 읽으십시오. 또한 :''yoursite.com/dummy'라고 입력하면'dummy' 부분이 첫 번째 경로와 default_module 경로와 일치합니다 .Palcon은'더미 '가 컨트롤러인지 또는 카테고리인지 알 수있는 방법이 없습니다 별명." 즉,'site.com/category_name /'을 입력하면 앱은'category_name '이 컨트롤러인지 카테고리인지 알지 못합니다. 영어를 배웠으므로 알지만, 앱은 그렇지 않습니다. 당신은 비슷한 정규 표현식 이외의 더 나은 단서를 제공해야합니다 – YOMorales

+0

또한 "내가 제안하는 부분에서 내 제안을 읽어보십시오 ..." – YOMorales