blitzik/router

Nette 框架的路由器

dev-master 2017-09-08 14:19 UTC

This package is not auto-updated.

Last update: 2024-09-15 01:20:07 UTC


README

带有基本加载器的路由器对于只有少量页面的小型网站很有用。你只需在 Neon 文件中定义你的 URL 地址,路由器将处理其余部分。

安装

$ composer require blitzik/router

配置

你已经下载了扩展,现在需要将其注册到配置文件中

config.neon

extensions:
	router: blitzik\Router\DI\RouterExtension

扩展现在已注册为 router 名称。我们的新路由器应该已经可以工作。

如果你想将此路由器的功能与 Nette 的原生路由结合,我们可以在 RouteList 中添加我们的新路由器。

找到 RouterFactory.php 并修改它

class RouterFactory
{
    use Nette\StaticClass;

    public static function createRouter(Nette\Application\IRouter $customRouter)
    {
        $router = new RouteList;
        
        $router[] = $customRouter;
        $router[] = new Route('<presenter>/<action>', 'YourPresenter:default'); 

        return $router;
    }

}

编辑 config.neon

services:
	router.router:
		autowired: no

	myRouter: App\RouterFactory::createRouter(@router.router)

路由器已准备就绪,现在让我们创建一些 URL。路由文件的默认位置是 app/router/routing.neon。位置可以在配置文件中更改。

config.neon

router: # this is the name of registered extension
	routingFile: %appDir%/your/file/path/routing.neon

URL 定义

URL 定义在 paths 部分。

每个路径都可以指向它自己的表示器。

routing.neon(自动 ID 已禁用)

paths:	
	# empty string means main page
	"": Homepage:default        # example.com
	"about": About:default      # example.com/about
	"contact": Contact:default  # example.com/contact

如果您启用自动生成的内部 ID 或设置自己的内部 ID,则许多路径可以指向同一个表示器。
(如何在页面底部的路由器设置部分启用自动内部 ID,请参阅此页面)

如果启用自动内部 ID,您可以这样编写 URL。您不需要为指向同一表示器的路由指定内部 ID。

routing.neon(自动 ID 已启用)

paths:	 
	"": Homepage:default    # example.com
	"about": Page:default   # example.com/about
	"contact": Page:default # example.com/contact	

另一方面,如果禁用自动生成的内部 ID,并且您有一些指向同一表示器的 URL,您必须手动指定内部 ID,否则将抛出异常。

routing.neon(自动 ID 已禁用)

paths:
    "": Homepage:default # example.com 
    "about": # example.com/about
        destination: Page:default
        internalId: about
        
	   	
    "contact": # example.com/contact
        destination: Page:default
        internalId: contact

一些生成的标识符示例

paths:	
	                                       # Identifier
	"": Homepage:default                   # ""
	"page": Page:default                   # page
	"page2.html": Page:default             # page2.html
	"page-name": Page:default              # pageName
	"page-1name": Page:default             # page1name
	"en/pagename": Page:default            # enPagename
	"en/page-name": Page:default           # enPageName
	"en/category/page-name": Page:default  # enCategoryPageName
	

假设我们启用了自动生成的内部 ID 或我们有很多路径指向一个表示器,并且每个路径都手动设置了内部 ID。然后我们可以创建模板,并以标识符命名它们,然后处理它们

app
--- presenters
------ templates
--------- Page
------------ page.latte (example.com/page)
------------ page2.html.latte (example.com/page2.html)            
------------ pageName.latte (example.com/page-name)
etc.
class PagePresenter extends Nette\Application\UI\Presenter
{
    // $internalId parameter is the identifier
    public function actionDefault($internalId)
    {
        $this->setView($internalId);
        
        // or load page from database if you write your own url loader
    }
}

如果您不喜欢自动创建的标识符,您可以设置自己的

routing.neon(自动 ID 已启用)

paths:
	"": Homepage:default
	"about":
		destination: Page:default
		internalId: aboutPage # your identifier
	    
	"contact":
		destination: Page:default
		internalId: contactPage # your identifier

除了内部 ID 之外,您还可以在 internalParameters 部分下设置内部参数或更多参数

paths:
	"cool-page/january":
		destination: Page:default
		internalParameters:
			month: 1

	"cool-page/february":
		destination: Page:default
		internalParameters:
			month: 2
class PagePresenter extends Nette\Application\UI\Presenter
{
    // and here you will get the internal parameter/s
    public function actionDefault($internalId, $month)
    {
        
    }
}

每次更改您的路由文件后,都需要清除缓存。

重定向

路由器支持从一个 URL 简单重定向到另一个 URL

paths:
	"": Homepage:default
	"page":
		destination: Page:default
		redirectTo: different-page
		
	"different-page": Page:default

如果您有一个旧的 URL(并且该 URL 没有设置表示器和操作),您想将其重定向到新的 URL,但又不想在旧的 URL 上创建链接,您可以将其设置为单向 URL

paths:
	"": Homepage:default
	"old-page":
		oneWay: different-page
		
	"different-page": Page:default

本地化

当您构建多语言网站时,您需要了解当前设置的本地化。

您必须在 routing.neon 中指定本地化部分

locales:
	- cs
	- en
	- de

paths:
	"": Homepage:default	# cs
	"stranka": Page:default # cs
	"en/page": Page:default # en

如果您这样定义您的本地化,则列表中的第一个本地化将是默认的。如果您想明确指定默认本地化,您可以使用单词 default 作为键。

locales:
	- cs
	default: en
	- de

paths:
	"": Homepage:default	   # en
	"page": Page:default       # en
	"cs/stranka": Page:default # cs

本地化必须位于 URL 路径的开始处,这样路由器就可以获取此本地化并将其创建为一个参数,该参数将被传递到应用程序中。只有设置在列表中的本地化才能转换为参数。

参数过滤器

您可以将参数过滤器添加到路由器中,该过滤器将修改 URL 查询字符串中参数的值。

示例:如果您想隐藏 URL 中的真实、整数 ID。

我们必须首先创建一个参数过滤器,所以让我们创建一个实现接口 IParameterFilter 的类。

class PageIdFilter implements IParameterFilter
{
    // Method returns name of the filter
    // (must be unique otherwise an exception will be thrown)
    public function getName(): string
    {
        return 'PageIdFilter';
    }


    // method that have to "decode" encoded parameter
    public function filterIn($modifiedParameter): ?string
    {
        return (string)hexdec($modifiedParameter);
    }


    // method that have to "encode" parameter
    public function filterOut($parameter): ?string
    {
        return (string)dechex($parameter);
    }
}

因此,我们已经创建了我们自己的参数过滤器,并且我们必须将它注册到我们的配置文件中作为一个服务。路由扩展将会找到这个服务,并自动将其添加到路由器中。

config.neon

services:
	- PageIdFilter

参数过滤器现在已经准备好使用了。在路由文件中的每个路径都可以有一个“过滤器”部分,我们可以在这里指定哪些参数应该受到我们的过滤器的影响。

routing.neon(自动 ID 已禁用)

paths:
	"": Homepage:default
	
	products:
		destination: Product:overview
		filters:
			PageIdFilter: # our created filter
				- id  # name of affected parameter

路由器设置

您可以在路由文件中为每个URL设置一个扩展名(.html、...),但如果您想要全局设置它,有一个更好的解决方案。

config.neon

router:
	routingFile: %appDir%/your/file/path/routing.neon
	extension: html

如果您的网站使用SSL加密,您可以开启一个选项,这样就会在您的URL中反映出来。

config.neon

router:
	routingFile: %appDir%/your/file/path/routing.neon
	isSecured: true

如果您想让路由器自动为您的路由创建内部ID,您可以启用这个功能。

config.neon

router:
	autoInternalIds: true # by default it's FALSE