라우팅
멋진 URL은 모든 심각한 웹 애플리케이션에 꼭 필요한 것입니다. 이는 index.php?article_id=57
와 같은 보기 흉한 URL이 /read/intro-to-symfony
로 대체된다는 의미입니다. index.php?article_id=57
这类丑陋的URL要被/read/intro-to-symfony
取代。
拥有灵活性是更加重要的。你将页面的URL从/blog
改为/news
时需要做些什么?你需要跟踪和更新多少链接以做出改变?如果你使用Symfony的路由,这就很容易了。
Symfony路由器允许你定义创造性的url,映射到应用程序的不同区域。在本章结束时,你将可以做到:
创建复杂的路由,它们将映射到控制器
在模板和控制器中生成URL
从Bundle中(也可以从其它地方)加载路由资源
对路由除错
路由样例 ¶
一个路由,是指一个URL路径(path)到一个控制器(controller)的映射。例如,你想匹配一些URL:/blog/my-post
和 /blog/all-about-symfony
,并且发送路由到一个“能够查询和渲染那一篇博文”的控制器上。路由简单的很:
Annotations:// src/AppBundle/Controller/BlogController.phpnamespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class BlogController extends Controller{ /** * @Route("/blog/{slug}", name="blog_show") */ public function showAction($slug) { // ... }}
YAML:# app/config/routing.ymlblog_show: path: /blog/{slug} defaults: { _controller: AppBundle:Blog:show }
XML:<!-- app/config/routing.xml --><?xml version="1.0" encoding="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd"> <route id="blog_show" path="/blog/{slug}"> <default key="_controller">AppBundle:Blog:show</default> </route></routes>
PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add('blog_show', new Route('/blog/{slug}', array( '_controller' => 'AppBundle:Blog:show',))); return $collection;
定义blog_show
路由模式,用于匹配像/blog/*
的URL,把相关参数或通配符用slug
表示并传入。对于/blog/my-blog-post
这样的URL,slug
变量得到my-blog-post
的值,并供你控制器使用。美观blog_show
是一个内部名称,他没什么实际的意义就是一个唯一的标识。以后,你可用他来生成一些URL。
如果你不想去使用注释方式,因为你不喜欢他们,或者因为你不希望依赖于SensioFrameworkExtraBundle,你也可以使用YAML,XML或者PHP。在这些格式中,_controller
参数是一个特殊的键,它告诉symfony路由指定的URL应该执行哪个控制器。_controller
字符串称为逻辑名。它遵循规则指向一个特定的php类和方法,AppBundleControllerBlogController::showAction
方法。
恭喜!你刚刚创建了一个路由并把它连接到控制器。现在,当你访问/blog/my-post
,showAction
控制器将被执行并且$slug
变量就等于my-post
/blog
에서 /news
로 변경하려면 어떻게 해야 합니까? 변경하려면 몇 개의 링크를 추적하고 업데이트해야 합니까? Symfony의 라우팅을 사용하면 쉽습니다. Symfony Router를 사용하면 애플리케이션의 다양한 영역에 매핑되는 창의적인 URL을 정의할 수 있습니다. 이 장을 마치면 다음을 수행할 수 있습니다. 🎜- 🎜컨트롤러에 매핑될 복잡한 경로 생성🎜
- 🎜템플릿 및 컨트롤러에서 URL 생성🎜 li>< li>🎜번들(또는 다른 위치)에서 라우팅 리소스 로드🎜
- 🎜디버그 라우팅🎜
라우팅 예 ¶
🎜A 경로는 컨트롤러(controller ) 매핑에 대한 URL 경로(path)를 나타냅니다. 예를 들어,/blog/my-post
및 /blog/all-about-symfony
와 같은 일부 URL을 일치시키고 "can query and 컨트롤러에서 해당 블로그 게시물을 렌더링합니다. 라우팅은 매우 간단합니다. 🎜GET /blog/my-blog-post
YAML:# app/config/config.yml framework: # ... router: { resource: '%kernel.root_dir%/config/routing.yml' }
XML:<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:framework="http://symfony.com/schema/dic/symfony" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd"> <framework:config> <!-- ... --> <framework:router resource="%kernel.root_dir%/config/routing.xml" /> </framework:config></container>
PHP:// app/config/config.php$container->loadFromExtension('framework', array( // ... 'router' => array( 'resource' => '%kernel.root_dir%/config/routing.php', ),));🎜
/blog/*
와 같은 URL을 일치시키는 데 사용되는 blog_show
라우팅 패턴을 정의하고 slug
를 사용하세요. 관련 매개변수 또는 와일드카드의 경우 code>가 표시되어 전달됩니다. /blog/my-blog-post
와 같은 URL의 경우 slug
변수는 my-blog-post
값을 가져와서 다음 위치에 제공합니다. 컨트롤러 사용. 아름다운 blog_show
는 내부 이름이며 실질적인 의미는 없으며 단지 고유 식별자일 뿐입니다. 나중에 이를 사용하여 일부 URL을 생성할 수 있습니다. 🎜🎜주석이 마음에 들지 않거나 SensioFrameworkExtraBundle에 의존하고 싶지 않기 때문에 주석을 사용하고 싶지 않은 경우 YAML, XML 또는 PHP를 사용할 수도 있습니다. 이러한 형식에서 _controller
매개변수는 경로에 의해 지정된 URL에 대해 어떤 컨트롤러가 실행되어야 하는지를 Symfony에게 알려주는 특수 키입니다. _controller
문자열을 논리적 이름이라고 합니다. 이는 규칙을 따르고 특정 PHP 클래스 및 메서드인 AppBundleControllerBlogController::showAction
메서드를 가리킵니다. 🎜🎜축하해요! 방금 경로를 생성하고 이를 컨트롤러에 연결했습니다. 이제 /blog/my-post
를 방문하면 showAction
컨트롤러가 실행되고 $slug
변수는 내 게시물
. 🎜🎜Symfony 라우팅의 목표: 요청된 URL을 컨트롤러에 매핑합니다. 이 목표에 따라 가장 복잡한 URL도 간단하게 매핑할 수 있는 다양한 기술을 배우게 됩니다. 🎜라우팅: 자세히 살펴보기 ¶
요청이 애플리케이션으로 전송되면 클라이언트 요청의 정확한 "리소스" 주소가 포함됩니다. 이 주소는 URL(또는 URI)이라고 하며 /contact
, /blog/read-me
등이 될 수 있습니다. 다음은 HTTP 요청의 예입니다. /contact
、/blog/read-me
或其它任何东西。下面是一个HTTP请求的例子:
Annotations:// src/AppBundle/Controller/MainController.php // ...class MainController extends Controller{ /** * @Route("/") */ public function homepageAction() { // ... }}
symfony路由系统的目的是解析url,并确定调用哪个控制器。整个过程是这样的:
由Symfony的前端控制器(如
app.php
)来处理请求。symfony的核心(Kernel内核)要求路由器来检查请求。
路由将输入的URL匹配到一个特定的路由,并返回路由信息,其中包括要执行的控制器信息。
Symfony内核执行控制器并最终返回
Response
对象。
路由是将一个输入URL转换成特定的工具来执行控制器。
创建路由 ¶
Symfony从一个单一的路由配置文件中加载所有的路由到你的应用程序。美观路由配置文件通常是app/config/routing.yml
YAML:# app/config/routing.yml_welcome: path: / defaults: { _controller: AppBundle:Main:homepage }Symfony 라우팅 시스템의 목적은 URL을 구문 분석하고 호출할 컨트롤러를 결정하는 것입니다. 전체 프로세스는 다음과 같습니다:
- 요청은 Symfony의 프런트 엔드 컨트롤러(예:경로는 입력 URL을 특정 경로와 일치시키고 실행할 컨트롤러 정보를 포함한 경로 정보를 반환합니다.
app.php
)에 의해 처리됩니다.
symfony(커널)의 핵심은 요청을 확인하기 위해 라우터가 필요합니다.
Response
객체를 반환합니다. 🎜app/config/routing.yml
이지만 애플리케이션 구성 파일(xml 또는 php 형식의 구성 파일 포함)을 통해 어디에나 파일을 배치할 수도 있습니다. 🎜XML:<!-- app/config/routing.xml --><?xml version="1.0" encoding="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd"> <route id="_welcome" path="/"> <default key="_controller">AppBundle:Main:homepage</default> </route> </routes>🎜🎜
PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add('_welcome', new Route('/', array( '_controller' => 'AppBundle:Main:homepage',))); return $collection;
Annotations:// src/AppBundle/Controller/BlogController.php // ...class BlogController extends Controller{ /** * @Route("/blog/{slug}") */ public function showAction($slug) { // ... }}🎜모든 경로를 단일 파일에서 로드할 수 있지만 추가 경로 리소스를 포함하는 것이 일반적입니다. 이렇게 하려면 외부 라우팅 파일을 기본 라우팅 파일로 구성합니다. 자세한 내용은 외부 라우팅 리소스가 포함된 장을 참조하세요. 🎜🎜🎜🎜
기본 라우팅 구성 ¶
경로를 정의하는 것은 쉽습니다. 일반적인 애플리케이션에는 많은 경로가 있어야 합니다. 기본 경로는 path
일치 및 기본값
배열:path
匹配和defaults
数组:
YAML:# app/config/routing.ymlblog_show: path: /blog/{slug} defaults: { _controller: AppBundle:Blog:show }
XML:<!-- app/config/routing.xml --><?xml version="1.0" encoding="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd"> <route id="blog_show" path="/blog/{slug}"> <default key="_controller">AppBundle:Blog:show</default> </route></routes>
PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add('blog_show', new Route('/blog/{slug}', array( '_controller' => 'AppBundle:Blog:show',))); return $collection;
Annotations:// src/AppBundle/Controller/BlogController.php // ...class BlogController extends Controller{ /** * @Route("/blog/{page}", defaults={"page" = 1}) */ public function indexAction($page) { // ... } /** * @Route("/blog/{slug}") */ public function showAction($slug) { // ... }}
该路由匹配首页(/
)并将它映射到AppBundle:Main:homepage
控制器。_controller
字符串被Symfony转换成PHP函数去执行。美观过程在本章(控制器命名模式)中被简短提及。
带参数的路由 ¶
路由系统支持很多有趣的路由写法。许多的路由都可以包含一个或者多个“参数或通配符”占位符:
YAML:# app/config/routing.ymlblog: path: /blog/{page} defaults: { _controller: AppBundle:Blog:index, page: 1 }blog_show: path: /blog/{slug} defaults: { _controller: AppBundle:Blog:show }
XML:<!-- app/config/routing.xml --><?xml version="1.0" encoding="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd"> <route id="blog" path="/blog/{page}"> <default key="_controller">AppBundle:Blog:index</default> <default key="page">1</default> </route> <route id="blog_show" path="/blog/{slug}"> <default key="_controller">AppBundle:Blog:show</default> </route></routes>
PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add('blog', new Route('/blog/{page}', array( '_controller' => 'AppBundle:Blog:index', 'page' => 1,))); $collection->add('blog_show', new Route('/blog/{show}', array( '_controller' => 'AppBundle:Blog:show',))); return $collection;
Annotations:// src/AppBundle/Controller/ArticleController.php // ...class ArticleController extends Controller{ /** * @Route( * "/articles/{_locale}/{year}/{title}.{_format}", * defaults={"_format": "html"}, * requirements={ * "_locale": "en|fr", * "_format": "html|rss", * "year": "\d+" * } * ) */ public function showAction($_locale, $year, $title) { }}
美观路径将匹配任何/blog/*
的URL。更妙的是,美观{slug}
占位符将自动匹配到控制器中。换句话说,如果该URL是/blog/hello-world
,控制器中$slug
变量的值就是hello-world
。这可以用来,匹配博客文章标题的字符串。
然而这种方式路由将不会匹配/blog
这样的URL,因为默认情况下,所有的占位符都是必填的。当然这也是可以变通的,可以在defaults
数组中添加占位符(参数)的值来实现。
添加{通配符}的条件 ¶
快速浏览一下已经创建的路由:
YAML:# app/config/routing.ymlarticle_show: path: /articles/{_locale}/{year}/{title}.{_format} defaults: { _controller: AppBundle:Article:show, _format: html } requirements: _locale: en|fr _format: html|rss year: \d+
XML:<!-- app/config/routing.xml --><?xml version="1.0" encoding="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd"> <route id="article_show" path="/articles/{_locale}/{year}/{title}.{_format}"> <default key="_controller">AppBundle:Article:show</default> <default key="_format">html</default> <requirement key="_locale">en|fr</requirement> <requirement key="_format">html|rss</requirement> <requirement key="year">\d+</requirement> </route></routes>
PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add( 'article_show', new Route('/articles/{_locale}/{year}/{title}.{_format}', array( '_controller' => 'AppBundle:Article:show', '_format' => 'html', ), array( '_locale' => 'en|fr', '_format' => 'html|rss', 'year' => '\d+', ))); return $collection;
// src/AppBundle/Controller/BlogController.phpnamespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class BlogController extends Controller{ public function showAction($slug) { // ... }}
你能发现问题吗?两个路由都匹配类似/blog/*
的URL。Symfony路由总是选择它第一个匹配的(blog)路由。换句话说,该blog_show
路由永远被匹配。相反,像一个/blog/my-blog-post
的URL会匹配第一个(blog
)路由,并返回一个my-blog-post
的值给{page}
参数。
URL | Route | Parameters | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/blog/2 | blog_list | $page = 2 | ||||||||||||
/blog/my-blog-post | blog_show | $slug = my-blog-post public function showAction($slug){ // ...} $params = $this->get('router')->match('/blog/my-blog-post'); // array( // 'slug' => 'my-blog-post', // '_controller' => 'AppBundle:Blog:show', // ) $uri = $this->get('router')->generate('blog_show', array( 'slug' => 'my-blog-post')); // /blog/my-blog-post class MainController extends Controller{ public function showAction($slug) { // ... $url = $this->generateUrl( 'blog_show', array('slug' => 'my-blog-post') ); }} $url = $this->container->get('router')->generate( 'blog_show', array('slug' => 'my-blog-post')); 이 경로는 홈페이지( | 매개변수를 사용한 라우팅 ¶
URL | 경로 | 매개변수 |
---|---|---|
/blog/2 |
blog_list
🎜$page
= 2
🎜🎜/blog/my-blog-post
🎜blog_show
🎜$slug
= 내 블로그 포스트
🎜🎜🎜 🎜{wildcard}에 기본값 제공 ¶
고급 라우팅 예 ¶
Symfony에서 강력한 라우팅 구조를 생성하여 필요한 모든 것을 얻을 수 있습니다. 다음은 라우팅 시스템이 얼마나 유연한지 보여주는 예입니다.
rrreeerrreeerrreeerrreee보시다시피 아름다운 라우팅은 다음과 같이 {_locale}
를 충족하는 URL의 일부와만 일치합니다. en
또는 fr
) 및 {연도}
는 숫자입니다. 또한 이 경로는 마침표를 사용하여 두 개의 자리 표시자를 구분할 수 있음을 보여줍니다. 위 경로와 일치하는 URL은 다음과 같습니다.{_locale}
为(en
或者fr
)和 {year}
是数字的。该路由还向你展示了你可以使用一个句号来分割两个占位符。上面路由匹配的URL如下:
/articles/en/2010/my-post
/articles/fr/2010/my-post.rss
/articles/en/2013/my-latest-post.html
/articles/fr/2010/my-post.rss
/articles /en/2013 /my-latest-post.html
Special_format 경로 매개변수_format
경로 매개변수도 강조되어 있습니다. 이 매개변수를 사용하면 일치하는 값이 요청
개체의 "요청 형식"이 됩니다. #🎜🎜##🎜🎜#마지막으로 요청 형식은 "Content-Type
응답 설정"과 같은 곳에서 사용됩니다. 예를 들어 json
요청 형식은 다음과 같습니다. 코드>application/json의 < Content-Type
)으로 변환됩니다. 또한 컨트롤러에서 다양한 _format
값을 기반으로 다양한 템플릿을 렌더링하는 데 사용할 수도 있습니다. _format
매개변수는 동일한 콘텐츠를 다양한 형식으로 렌더링하는 매우 강력한 방법입니다. #🎜🎜##🎜🎜#symfony3.0 이전 버전에서는 "_format
_format)를 재정의할 수 있습니다. > code>" 쿼리 매개변수(예: /foo/bar?_format=json
). 이 동작을 남용하는 것은 나쁜 습관으로 간주되며 프로그램을 Symfony3으로 업그레이드하는 것을 "매우 복잡"하게 만들 것입니다. #🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#때로는 경로의 특정 부분을 "전역 구성"으로 만들고 싶을 때가 있습니다. Symfony는 서비스 컨테이너 매개변수를 사용하여 이를 수행할 수 있습니다. 자세한 내용은 라우팅에서 서비스 컨테이너 매개변수를 사용하는 방법을 참조하세요. #🎜🎜##🎜🎜##🎜🎜#특수 경로 매개변수 ¶
보시다시피 모든 경로 매개변수나 기본값은 컨트롤러 메서드의 매개변수로 사용될 수 있습니다. 또한 세 가지 매개변수는 특별합니다. 각 매개변수는 애플리케이션에 고유한 기능을 추가합니다.
_controller
_controller
_format
_locale
控制器命名模式 ¶
如果你使用YAML,XML或PHP的路由配置,那么每个路由都必须有一个_controller
参数,用于指示当路匹配时应执行哪个控制器。这个参数使用一个简单的字符串pattern,叫做控制器逻辑名(logical controller name),Symfony用它来映射一个特定的PHP方法或类。此pattern有三个部分,用冒号隔开:
bundle:controller:action
假设,一个_controller
值是一个AppBundle:Blog:show
那么意味着:
Bundle | Controller Class | Method Name |
---|---|---|
AppBundle | BlogController | showAction 보시다시피 이 매개변수는 어떤 컨트롤러를 결정하는 데 사용됩니다. "경로가 일치할 때" 실행됩니다. |
컨트롤러 명명 패턴 < a href="#catalog9" class="headerlink" id="catalog9">¶
🎜YAML, XML 또는 PHP 라우팅 구성을 사용하는 경우 각 경로에_controller<가 있어야 합니다. /code> 매개변수, 경로가 일치할 때 실행되어야 하는 컨트롤러를 나타내는 데 사용됩니다. 이 매개변수는 Symfony가 특정 PHP 메소드나 클래스를 매핑하는 데 사용하는 논리 컨트롤러 이름이라는 간단한 문자열 패턴을 사용합니다. 이 패턴은 콜론으로 구분된 세 부분으로 구성됩니다. 🎜🎜bundle:controller:action🎜
🎜 _controller
값이 AppBundle:Blog:show
는 다음을 의미합니다: 🎜번들 /th > 컨트롤러 클래스 메서드 이름 🎜AppBundle
🎜BlogController
🎜showAction 코드>🎜🎜🎜🎜컨트롤러는 다음과 같습니다.
rrreeeSymfony가 Blog
의 클래스 이름으로 Controller
문자열을 추가했습니다(Blog
= > BlogController
), Action
문자열을 메서드 이름으로 추가합니다(show
=>showAction
). Blog
上添加了字符串Controller
作为类名(Blog
=>BlogController
),添加字符串Action
作为方法名(show
=>showAction
)。
你也可以使用它的FQCN类名及方法来指定这个类:AppBundleControllerBlogController::showAction
。但如果你遵循一些简单的命名约定,逻辑名将更加简洁也更加灵活。
除了使用逻辑名和FQCN类名之外,Symfony也支持第三种指定控制器的方式。这种方式只使用一个冒号分隔(如service_name:indexAction
),并将控制器作为一个服务来引用(参见如何把控制器定义为服务)。
路由参数和控制器参数 ¶
路由参数(如{slug}
是非常重要的,因为它(们)都被用作控制器方法的参数:
rrreee现实中,defaults
集将参数值一起合并成一个表单数组。该数组中的每个键都被做为控制器的参数。
换句话说,对于控制器方法的每个参数,Symfony2都会根据该名称来查找路由参数,并将其值指向到控制器作为参数。在上面的高级示例当中,下列变量的任何组合(以任意方式)都被用作showAction()
方法的参数:
$_locale
$year
$title
$_format
$_controller
$_route
占位符和defaults
集被合并在一起,就就算是$_controller
变量也是可用的。更多细节的讨论,请参见作为 控制器–把路由参数传入控制器。
你也可以使用指定的$_route
FQCN 클래스 이름과 메서드(AppBundleControllerBlogController::showAction
)를 사용하여 이 클래스를 지정할 수도 있습니다. 그러나 몇 가지 간단한 명명 규칙을 따르면 논리적 이름이 더 간단하고 유연해집니다. 논리적 이름과 FQCN 클래스 이름을 사용하는 것 외에도 Symfony는 컨트롤러를 지정하는 세 번째 방법도 지원합니다. 이 접근 방식은 콜론(예: service_name:indexAction
)으로만 구분되며 컨트롤러를 서비스로 참조합니다(컨트롤러를 서비스로 정의하는 방법 참조). 🎜🎜🎜경로 매개변수 및 컨트롤러 매개변수 ¶
🎜경로 매개변수(예: {slug}
)는 컨트롤러 메서드로 사용되기 때문에 매우 중요합니다. 매개변수: 🎜rrreee 🎜실제로 defaults
세트는 매개변수 값을 양식 배열로 결합합니다. 배열의 각 키는 컨트롤러 메서드의 각 매개변수로 사용됩니다. , Symfony2는 해당 이름을 기반으로 경로 매개변수를 조회하고 해당 값을 매개변수로 컨트롤러에 지정합니다. 위의 고급 예에서는 다음 변수의 조합이 어떤 방식으로든 의 매개변수로 사용됩니다. showAction()
메소드: 🎜- 🎜$_locale🎜
- 🎜$year🎜
- 🎜$title 🎜
- 🎜 $_format🎜
- 🎜$_controller🎜
- 🎜$_route🎜
🎜 자리 표시자와 기본값
세트가 함께 병합됩니다. $_controller
변수도 사용할 수 있습니다. 자세한 내용은 컨트롤러로 – 컨트롤러에 경로 매개변수 전달 🎜<을 참조하세요. class="admonition admonition-tip">🎜또한 값이 일치하는 경로 이름인 지정된 $_route
변수를 사용할 수도 있습니다.경로에 추가 정보를 정의하고 컨트롤러에서 해당 정보에 액세스할 수도 있습니다. 자세한 내용은 경로에서 컨트롤러로 추가 정보를 전달하는 방법
URL 생성 ¶
라우팅 시스템은 URL을 생성하는 데에도 사용됩니다. 실제로 라우팅은 URL을 컨트롤러 + 매개변수에 매핑하고 경로 + 매개변수를 다시 URL에 매핑하는 양방향 시스템입니다. match()
및 generate()
메서드는 이러한 양방향 시스템을 형성합니다. 이전 blog_show
예 사용: match()
和generate()
方法构成了这个双向系统。使用之前的blog_show
的例子:
rrreee要生成一个URL,你需要指定路由的名称(如blog_show
)以及任意的通配符(如slug = my-blog-post
)。有个这些信息,任何URL就可以很容易的生成了:
rrreee在控制器中你没有继承symfony的父类Controller,那么你不可以使用generateUrl()
快捷方法,但你可以使用router的generate()
服务方法:
rrreee在即将到来的部分中,你将学会如何在模板中生成URL地址。
如果你的应用程序前端使用的是ajax请求,你可能希望根据你的路由配置,在JavaScript中生成URL。通过使用FOSJsRoutingBundle,你就可以做到:
rrreee更多信息请阅读这个bundle文档。
生成带有Query Strings的URL ¶
这个generate
方法采用通配符数组来生成URL。但是如果在其中添加了额外的键值对,他们将会被添加成Query Strings来生成一个新的URL:
rrreee在模板里生成URL ¶
在应用程序页面之间进行连接时,最常见的地方就是从模板中生成URL。这样做其实和以前一样,但是使用的是一个模板助手函数:
rrreeerrreee生成绝对的URL ¶
默认情况下,路由器会产生相对的URL(如/blog
)。在控制器中,很简单的把generateUrl()
方法的第三参数设置成UrlGeneratorInterface::ABSOLUTE_URL
即可。
rrreee在模板引擎Twig中,要使用url()
函数(生成一个绝对的URL),而不是path()
rrreee
URL을 생성하려면 경로 이름(예: blog_show
)과 와일드카드(예: 슬러그 = 내 블로그 포스트
). 이 정보를 사용하면 모든 URL을 쉽게 생성할 수 있습니다.
rrreee
컨트롤러에서 Symfony 상위 클래스 Controller를 상속하지 않으면 generateUrl()
바로가기 메서드를 사용할 수 없습니다. 하지만 라우터의 generate()
서비스 메소드를 사용할 수 있습니다.
rrreee
다음 섹션에서는 템플릿에서 URL 주소를 생성하는 방법을 배우게 됩니다.
애플리케이션 프런트 엔드에서 Ajax 요청을 사용하는 경우 라우팅 구성에 따라 JavaScript로 URL을 생성할 수 있습니다. FOSJsRoutingBundle을 사용하면 다음을 수행할 수 있습니다. rrreee
자세한 내용은 이 번들 문서를 읽어보세요.
쿼리 문자열로 URL 생성 ¶
🎜이 생성< / code> 메소드는 와일드카드 배열을 사용하여 URL을 생성합니다. 그러나 추가 키-값 쌍이 추가되면 쿼리 문자열로 추가되어 새 URL을 생성합니다. 🎜rrreee¶
🎜애플리케이션 페이지를 연결하는 가장 일반적인 장소는 템플릿에서 URL을 생성하는 것입니다. 이 작업은 실제로 이전과 동일하지만 템플릿 도우미 함수를 사용합니다: 🎜rrreeerrreee절대 URL 생성 ¶< / h3>🎜기본적으로 라우터는 상대 URL(예: /blog
)을 생성합니다. 컨트롤러에서 generateUrl()
메서드의 세 번째 매개변수를 UrlGeneratorInterface::ABSOLUTE_URL
로 설정하는 것은 매우 간단합니다. 🎜rrreee🎜템플릿 엔진 Twig에서는 path()
함수(상대 URL 생성) 대신 url()
함수(절대 URL 생성)를 사용하세요. PHP에서는 generateUrl()에 UrlGeneratorInterface::ABSOLUTE_URL:🎜rrreeerrreeerrreee🎜를 전달해야 합니다. 요약 ¶🎜🎜 라우팅은 들어오는 요청의 URL을 요청을 처리하는 데 사용되는 컨트롤러 함수에 매핑하는 시스템입니다. 이를 통해 아름다운 URL을 지정하고 URL에서 애플리케이션의 기능을 "분리"할 수 있습니다. 라우팅은 양방향 메커니즘이므로 URL을 생성하는 데에도 사용할 수 있습니다. 🎜🎜계속 진행하세요! ¶🎜🎜라우팅이 확인되었습니다! 이제 컨트롤러의 전원 차단을 해제해 보세요. 🎜🎜