blitzik / router
Nette 框架的路由器
Requires
- php: >=7.1
- nette/application: ^2.4
- nette/caching: ^2.5
- nette/di: ^2.4
- nette/robot-loader: ^2.4
Requires (Dev)
- nette/application: ^2.4
- nette/bootstrap: ^2.4
- nette/caching: ^2.5
- nette/di: ^2.4
- nette/robot-loader: ^2.4
- tracy/tracy: ^2.4
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