저는 Zend Framework 2를 처음 접해서이 프레임 워크를 배우고 싶습니다. 라우터에서 URL 별칭을 만들고 싶습니다. 난 내 응용 프로그램의 기본 컨트롤러의 기본 액션에 www.myapp.local/node/1
그 경로를 입력 할 때 예를 들어 , 나는 ZF2 : 라우터에서 URL 별명을 생성하십시오.
'router' => array(
'routes' => array(
'home' => array(
'type' => 'Zend\Mvc\Router\Http\Literal',
'options' => array(
'route' => '/',
'defaults' => array(
'controller' => 'Application\Controller\Index',
'action' => 'index',
),
),
),
'node' => array(
'type' => 'Application\Controller\AliasSegment',
'options' => array(
'route' => '/node[/:id]',
'constraints' => array(
'id' => '[0-9]+'
),
'defaults' => array(
'__NAMESPACE__' => 'Application\Controller',
'controller' => 'Index',
'action' => 'index',
'id' => '0'
),
),
'may_terminate' => true,
),
),
),
module.config.php
이 뭔가를 정의했습니다. 내가 원하는 것은 URL 경로에 대한 별칭을 처리 할 수있는 라우터 확장입니다. 예 :www.myapp.local/node/1 = www.myapp.local/aboutus
www.myapp.local/node/2 = www.myapp.local/company/gallery
ZF에서 가능하다는 것을 알고 있습니다. 다음 링크는 ZF에서이를 달성하는 방법을 개별지도하는 것입니다 friendly urls 을 나는이 폴란드어 것을 알고 있지만, 코드가 자명 내가 생각입니다 :)
아이디어는 조립 유효한 URL 별칭을 사용하는 URL 도우미를 사용하는 것입니다 또는 일반 세그먼트 (노드/[: ID])
이미 내 응용 프로그램 \ 컨트롤러 폴더에 AliasSegment 클래스를 만든하지만 나에게 오류 보여줍니다 (불완전)
Fatal error: Uncaught exception 'Zend\ServiceManager\Exception\ServiceNotFoundException' with message 'Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Application\Controller\AliasSegment' in C:\xampp\htdocs\industengine\vendor\zendframework\zendframework\library\Zend\ServiceManager\ServiceManager.php:450 Stack trace: #0
내 AliasSegment 클래스 :
<?php
namespace Zend\Mvc\Router\Http;
use Traversable;
use Zend\Mvc\Router\Exception;
use Zend\Stdlib\ArrayUtils;
use Zend\Stdlib\RequestInterface as Request;
class AliasSegment extends Segment
{
public function match(Request $request, $pathOffset = null)
{
}
}
나는 몇 시간 동안 대답을 찾고 있었고 아무것도 찾을 수 없었다. 적어도 제가 잘못하고있는 부분, 코드를 삽입 할 곳 또는 어쩌면 당신은 더 나은 해결책을 알고 있습니까?
나는 준비된 응용 프로그램을 찾고 있지 않습니다. 내가 뭔가를 배우고 싶어하지만 당신은 세부 사항을 편집 제 영어 :
미리 미안에
감사합니다 :) 나에게 답을 말할 수 있다면 감사하겠습니다 :이
내 사용자 지정 라우터가 지금 일하고있어. 이 시점에서 별칭은 하드 코드되지만 작동합니다.
내 AliasSegment 클래스는 지금 보이는이 경우 /about/gallery
에서
<?php
namespace Application\Controller;
use Traversable;
use Zend\Mvc\Router\Exception;
use Zend\Stdlib\ArrayUtils;
use Zend\Stdlib\RequestInterface as Request;
use Zend\Mvc\Router\Http;
class AliasSegment extends \Zend\Mvc\Router\Http\Segment
{
public function match(Request $request, $pathOffset = null)
{
$uri = $request->getUri();
$path = $uri->getPath();
//sample logic here
//for /about/gallery uri set node id to 1
//todo: get action, controller and module from navigation
if($path == '/about/gallery'){
$uri->setPath('/node/1');
$request->setUri($uri);
}
return parent::match($request, $pathOffset);
}
protected function buildPath(array $parts, array $mergedParams, $isOptional, $hasChild)
{
if(isset($mergedParams['link'])){
return $mergedParams['link'];
}
return parent::buildPath($parts, $mergedParams, $isOptional, $hasChild);
}
}
가 /node/1
에 대한 별칭입니다. 두 주소 모두 정확합니다. buildPath 함수는 별칭 경로를 올바르게 반환합니다. 글쎄,이 사람이 유용 할 희망 :
그러나 나는 '링크'라는 추가 매개 변수로 Zend_Navigation에서 설정하고 싶습니다.
나는 달성하고자하는 것의 50 %를했지만 지금 라우터에서 Zend_Navigation을 얻는 데 문제가 있습니다. 나는 그것을 어떻게 통과해야할지 모른다. 나는 다음과 같이해야한다고 생각한다.
$sm = $this->getServiceLocator();
$auth = $sm->get('Navigation');
내 IndexController에서 작동하지만 내 AliasSegment에서 작동하지 않는다. '링크'매개 변수를 사용하여 탐색 배열 노드를 찾아야합니다. 나는 해결책을 발견했습니다
편집 할 수 있습니다. 대답은 아래에 있습니다.이 컨트롤러 인 경우, 내가 가지고 module.config.php에
내가 네임 스페이스를 변경했지만 작동하지 않았다 감사하지만 나는했습니다 몇 가지 및 변경, 여기에 전체 클래스입니다 않습니다! invokables를 사용하는 것은 불필요한 일입니다. 내 질문을 편집 했으므로 다음을보십시오. – mkatanski