我正在使用Zend开发一个Rest Controller,我对url到Router的映射感到困惑.
基本上我读了Zend路由器,我无法计划我的网址,以满足上述路线.
这些是我应该映射到路由器的一些网址.
http://localhost/api/v1/tags.xml?abc = true (param:abc = true)
http://localhost/api/v1/tags/123456.xml (param:123456.xml)
http://localhost/api/v1/tags/123456/pings.xml (参数:123456,pings.xml)
http://localhost/api/v1/tags/123456/pings.xml?a = 1&b = 2(参数:123456,pings.xml,a = 1,b = 2)
http://localhost/api/v1/tags/123456/pings/count.xml(参数:123456,ping,count.xml)
我正在计划,对于网址模式1到3,"标签"应该是控制器,对于网址模式4到6,"ping"应该是控制器.
现在我不确定如何配置路由器,以便上述方案可行.请注意,我无法更改这些网址.我可以提供100分的良好答案.
我正在尝试为N级深度编写路线.所以通常的类别URL看起来像这样:
http://website/my-category/my-subcategory/my-subcategory-level3/my-subcategory-level4
Run Code Online (Sandbox Code Playgroud)
它有一个未知的深度,我的路线必须匹配所有可能的水平.我为此做了一个路线,但我无法从我的控制器中获取所有参数.
$routeCategory = new Zend_Controller_Router_Route_Regex(
'(([a-z0-9-]+)/?){1,}',
array(
'module' => 'default',
'controller' => 'index',
'action' => 'index'
),
array( 1 => 'path'),
'%s'
);
$router->addRoute('category', $routeCategory);
Run Code Online (Sandbox Code Playgroud)
我似乎找不到将路由匹配的params发送到控制器的方法.如果您有更好的解决方案,我愿意接受建议!
我正在尝试测试一个控制器.Zend Tool生成了以下代码:
class Default_CarrinhoControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
public function setUp()
{
$this->bootstrap = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini');
parent::setUp();
}
public function testIndexAction()
{
$params = array('action' => 'index', 'controller' => 'Carrinho', 'module' => 'default');
$urlParams = $this->urlizeOptions($params);
$url = $this->url($urlParams);
$this->dispatch($url);
// assertions
$this->assertModule($urlParams['module']);
$this->assertController($urlParams['controller']);
$this->assertAction($urlParams['action']);
$this->assertQueryContentContains(
'div#view-content p',
'View script for controller <b>' . $params['controller'] . '</b> and script/action name <b>' . $params['action'] . '</b>'
);
}
}
Run Code Online (Sandbox Code Playgroud)
PHPUnit Bootstrap
<?php
// Define path to application directory
defined('APPLICATION_PATH') …
Run Code Online (Sandbox Code Playgroud) 我在这里尝试创建网址,如:
/admin/login
/moderator/login
Run Code Online (Sandbox Code Playgroud)
请求将由相同的控制器和为登录做出的动作提供,即 /account/login/<type>
目前,我可以制作以下网址:
/login/admin
/login/moderator
我当前的配置文件如下所示:
resources.router.routes.login.route = "login/:type"
resources.router.routes.login.defaults.controller = "account"
resources.router.routes.login.defaults.action = "login"
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚,关于如何将type
变量放在URL的开头,我试过但它给出了服务器错误.
编辑
我完成了这个,但无法理解为什么这不能更早地工作:
resources.router.routes.login.route = ":type/login"
resources.router.routes.login.defaults.controller = "account"
resources.router.routes.login.defaults.action = "login"
Run Code Online (Sandbox Code Playgroud)
编辑
是否有可能使这种安排更加灵活,以便:
/login
=>/admin/login
我不是通过.htaccess寻找解决方案
我在路径中的可选约束存在问题,该路径在其子项中是非可选的.我的路由结构如下:
'profile' => [
'type' => 'segment',
'options' => [
'route' => '/profile[/:id]',
'constraints' => ['id' => '[0-9]*'],
'defaults' => [
'controller' => 'User\Controller\User',
'action' => 'profile'
]
],
'may_terminate' => true,
'child_routes' => [
'sessions' => [
'type' => 'literal',
'options' => [
'route' => '/sessions',
'defaults' => ['action' => 'sessions']
]
]
]
]
Run Code Online (Sandbox Code Playgroud)
在我看来应该给我以下路线:
/profile
- 工作/profile/123
- 工作/profile/sessions
- 不起作用/profile/123/sessions
- 工作当我在URL视图助手中使用路由3时,我收到以下错误:
$this->url('profile/sessions');
Run Code Online (Sandbox Code Playgroud)
Zend\Mvc\Router\Exception\InvalidArgumentException
:缺少参数"id"
我原来[0-9]+
作为我的约束,但使它成为可选(*
)似乎没有帮助.以前有没有人遇到这个案子?
我需要在Zend中创建路由来简单地复制当前的实时站点url结构,这种结构很不一致
我想要做的是路由子域如下:
www.site.com - >静态路由器
a.site.com&b.site.com - >类别控制器
c.site.com和d.site.com - >位置控制器
其余子域 - >用户控制器
谁能指导我如何解决这个问题,谢谢.
更新:
首先感谢Fge,投票给你答案,它有效,但我还需要一些建议:
由于每个规则都有许多子域,因此有一种比在循环中添加规则更好的方法
foreach($ subdomains as $ a){$ tr = new Zend_Controller_Router_Route_Hostname("$ a.site.com",array('module'=>'mod','controller'=>'ctrl','param_1'=> $一个 )); $路由器 - > addRoute($一个,$ TR); }
如何将它与其他路由类型结合起来解析参数(链接?),比如http://a.site.com/:b/:c,我想把它解析为param_1(a),param_2(b) ,param_2(c)
我是Zend框架3的新手,并试图翻译路线,我已经部分成功.我能够翻译主路线并将其重定向到所需的位置,但对于子路线,翻译工作但重定向不起作用.能帮到我吗,我的代码如下.
module.config.php
'router' => [
'router_class' => TranslatorAwareTreeRouteStack::class,
'routes' => [
'setting' => [
'type' => Segment::class,
'options' => [
'route' => '/{locale}/{setting}',
'defaults' => [
'locale' => 'de',
'controller' => Controller\SettingController::class,
'action' => 'index',
],
],
'may_terminate'=>true,
'child_routes' =>[
'add' =>[
'type' =>'Segment',
'options' =>[
'route' =>'/{add}',
'defaults'=> [
'controller' => Controller\SettingController::class,
'action' => 'add',
],
],
],
],
],
],
],
Run Code Online (Sandbox Code Playgroud)
Module.php
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
$language_session = new …
Run Code Online (Sandbox Code Playgroud) php zend-translate zend-route zend-framework2 zend-framework3
我正在尝试创建一个"覆盖"这种URL的路由:
www.test.com/parent1/parent2/parent3/item
www.test.com/parent1/parent2/parent3/parent4/item1
未指定的那些父母的数量,它应该只用于为网站URL提供更好,更直观的外观.主要参数是"item".
我想解决这个问题的唯一方法就是使用Route_Regex,所以我尝试用这样的方法完成这个路由任务:
routes.test.type = "Zend_Controller_Router_Route_Regex"
routes.test.route = "test/(?:.*)?([^\/]+)"
routes.test.defaults.module = default
routes.test.defaults.controller = test
routes.test.defaults.action = index
routes.test.map.1 = "path"
routes.test.map.2 = "item"
routes.test.reverse = "test/%s%s"
Run Code Online (Sandbox Code Playgroud)
我没有对此进行过多次测试,因为我不确定我是否做了正确的事情......我不知道这个正则表达式应该是什么样的,我应该怎样对待这条"路径".
你能告诉我应该怎样做才能满足这种路线需求吗?所以,我只需要那个路径(parent1,parent2等),而主要的参数就是"item"......
我正在尝试设置有意义的URL,例如http://www.site.com/company/department,但它会破坏我在Controller/Action形状中的现有URL.
在我的bootstrap中,我按如下方式创建新路由:
$frontController = Zend_Controller_Front::getInstance();
$router = $frontController->getRouter();
$route = new Zend_Controller_Router_Route(":company/:dpt", array('controller' => 'browse'));
$router->addRoute("browse", $route);
Run Code Online (Sandbox Code Playgroud)
当我浏览到http://www.site.com/ABC_Co/dry_goods时,它会将我路由到BrowseController中的IndexAction.大!问题是我的其他管理员相关的URL - 例如/ company/create等 - 也在那里指挥.
有没有办法让Zend首先进行默认的 Controller/Action匹配,并且只在失败时恢复到Browse路由?
谢谢!
嗨我想在Zend应用程序中设置一些REST路由,我想知道如何限制可以访问路由的HTTP方法.
$route = new Zend_Controller_Router_Route('user/reset_password', array(
'module' => 'default',
'controller' => 'user',
'action' => 'resetpassword'
));
$front_controller->getRouter()->addRoute('reset_password', $route);
Run Code Online (Sandbox Code Playgroud)
在这条路线中,我想指定此路由将响应的HTTP动词,如GET,POST,PUT等,例如向数组添加"method"=>"POST".
谢谢,