penghalaan
URL yang kelihatan baik adalah satu kemestian mutlak untuk sebarang aplikasi web yang serius. Ini bermakna URL hodoh seperti index.php?article_id=57
akan digantikan dengan /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
kepada /news
? Berapa banyak pautan yang anda perlukan untuk menjejaki dan mengemas kini untuk membuat perubahan? Ini mudah jika anda menggunakan penghalaan Symfony. Penghala Symfony membolehkan anda mentakrifkan URL kreatif yang memetakan ke kawasan berbeza aplikasi anda. Pada penghujung bab ini, anda akan dapat: 🎜- 🎜Membuat laluan kompleks yang akan dipetakan kepada pengawal🎜
- 🎜Menghasilkan URL dalam templat dan pengawal🎜 li>< li>🎜Muatkan sumber penghalaan daripada Bundle (atau dari tempat lain)🎜
- 🎜Nyahpepijat penghalaan🎜
Contoh penghalaan ¶
🎜Satu laluan merujuk kepada laluan URL (laluan) ke pemetaan pengawal (pengawal). Sebagai contoh, anda ingin memadankan beberapa URL:/blog/my-post
dan /blog/all-about-symfony
dan menghantar laluan ke "can query and memberikan catatan blog itu" pada pengawal. Penghalaan adalah sangat mudah: 🎜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', ),));🎜 Tentukan corak penghalaan
blog_show
, yang digunakan untuk memadankan URL seperti /blog/*
dan gunakan slug
untuk parameter yang berkaitan atau kod bebas> mewakili dan dihantar masuk. Untuk URL seperti /blog/my-blog-post
, pembolehubah slug
mendapat nilai my-blog-post
dan memberikannya kepada penggunaan pengawal anda. blog_show
ialah nama dalaman Ia tidak mempunyai makna praktikal dan hanya pengecam unik. Kemudian, anda boleh menggunakannya untuk menjana beberapa URL. 🎜🎜Jika anda tidak mahu menggunakan anotasi kerana anda tidak menyukainya, atau kerana anda tidak mahu bergantung pada SensioFrameworkExtraBundle, anda juga boleh menggunakan YAML, XML atau PHP. Dalam format ini, parameter _controller
ialah kunci khas yang memberitahu symfony pengawal yang harus dilaksanakan untuk URL yang ditentukan oleh laluan. Rentetan _controller
dipanggil nama logik. Ia mengikut peraturan dan menunjuk kepada kelas dan kaedah PHP tertentu, kaedah AppBundleControllerBlogController::showAction
. 🎜🎜Tahniah! Anda baru sahaja mencipta laluan dan menyambungkannya kepada pengawal. Sekarang, apabila anda melawati /blog/my-post
, pengawal showAction
akan dilaksanakan dan pembolehubah $slug
akan sama dengan saya- pos
. 🎜🎜Matlamat penghalaan Symfony: Petakan URL yang diminta kepada pengawal. Mengikuti matlamat ini, anda akan mempelajari pelbagai teknik yang menjadikan pemetaan walaupun URL yang paling kompleks mudah. 🎜Penghalaan: Pandangan lebih dekat ¶
Apabila permintaan dihantar ke aplikasi anda, ia mengandungi alamat "sumber" yang tepat bagi permintaan pelanggan. Alamat ini dipanggil URL (atau URI), dan ia boleh menjadi /contact
, /blog/read-me
atau apa-apa sahaja. Berikut ialah contoh permintaan 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 }Tujuan sistem penghalaan symfony adalah untuk menghuraikan URL dan menentukan pengawal yang hendak dipanggil. Keseluruhan prosesnya adalah seperti ini:
- Permintaan diproses oleh pengawal bahagian hadapan Symfony (sepertiLaluan itu sepadan dengan URL input ke laluan tertentu dan mengembalikan maklumat laluan, termasuk maklumat pengawal yang akan dilaksanakan.
app.php
).
Inti symfony (Kernel) memerlukan penghala untuk menyemak permintaan.
Respons
. . -flow-1.png"/>🎜🎜 Penghalaan menukar URL input kepada alat khusus untuk melaksanakan pengawal. 🎜🎜Buat Laluan ¶🎜🎜🎜Symfony memuatkan semua laluan ke dalam aplikasi anda daripada satu fail konfigurasi penghalaan. Fail konfigurasi penghalaan yang cantik biasanya app/config/routing.yml
, tetapi anda juga boleh meletakkan fail itu di mana-mana sahaja melalui fail konfigurasi aplikasi (termasuk fail konfigurasi dalam format xml atau 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) { // ... }}🎜Walaupun semua laluan boleh dimuatkan daripada fail, adalah amalan biasa untuk memasukkan sumber laluan tambahan. Untuk melakukan ini, anda perlu mengkonfigurasi fail penghalaan luaran ke dalam fail penghalaan utama. Untuk maklumat terperinci, sila lihat bab ini: Mengandungi sumber penghalaan luaran. 🎜🎜🎜🎜
Konfigurasi penghalaan asas ¶
Menentukan laluan adalah mudah, aplikasi biasa juga harus mempunyai banyak laluan. Laluan asas terdiri daripada dua bahagian: path
padan dan lalai
Array: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')); Laluan ini sepadan dengan halaman utama ( | Penghalaan dengan parameter ¶
URL | Laluan | Parameter |
---|---|---|
/blog/2 |
blog_list
🎜$page
= 2
🎜🎜/blog/my-blog-post
🎜blog_show
🎜$slug
= my-blog-post
🎜🎜🎜 🎜Berikan {wildcard} nilai lalai ¶
Contoh penghalaan lanjutan ¶
Dalam Symfony anda boleh mencapai semua yang anda perlukan dengan mencipta struktur penghalaan yang berkuasa. Berikut ialah contoh untuk menunjukkan betapa fleksibelnya sistem penghalaan:
rrreeerrreeerrreeerrreeeSeperti yang anda lihat, penghalaan yang cantik hanya sepadan dengan sebahagian daripada URL yang memenuhi {_locale}
sebagai (fr
) dan {year}
ialah angka. Laluan ini juga menunjukkan kepada anda bahawa anda boleh menggunakan tempoh untuk memisahkan dua ruang letak. URL yang dipadankan dengan laluan di atas adalah seperti berikut:{_locale}
为(en
或者fr
)和 {year}
是数字的。该路由还向你展示了你可以使用一个句号来分割两个占位符。上面路由匹配的URL如下:
/articles/en/2010/my-post
/articles/fr/2010/my-post.rss
/articles/en/2013/my-latest-post.html
/articles/en/2013/my-latest-post.html
< /li>< /ul>
Parameter laluan _format khas_format
khas. Apabila parameter ini digunakan, nilai padanan menjadi "format permintaan" objek Request
. 🎜🎜Akhirnya, format permintaan digunakan di tempat seperti "menetapkan respons Content-Type
" (contohnya, format permintaan json
akan ditukar kepada aplikasi /json
's Content-Type
). Ia juga boleh digunakan dalam pengawal untuk memaparkan templat berbeza berdasarkan nilai _format
yang berbeza. Parameter _format
ialah cara yang sangat berkuasa untuk memaparkan kandungan yang sama dalam format yang berbeza. 🎜🎜Dalam versi sebelum symfony3.0, anda boleh mengatasi parameter format (_format
) dalam permintaan (objek) dengan menambahkan parameter pertanyaan bernama "_format
" Itu sahaja ( contohnya: /foo/bar?_format=json
). Penyalahgunaan tingkah laku ini dianggap sebagai amalan buruk dan akan menjadikan peningkatan program anda kepada symfony3 "sangat rumit". 🎜🎜🎜🎜🎜🎜Kadangkala, anda ingin menjadikan bahagian tertentu "konfigurasi global" penghalaan anda. Symfony boleh melakukan ini menggunakan parameter bekas perkhidmatan. Lihat Cara menggunakan parameter kontena perkhidmatan dalam penghalaan untuk mengetahui lebih lanjut. 🎜🎜🎜Parameter penghalaan khas ¶
Seperti yang anda lihat, setiap parameter penghalaan atau nilai lalai boleh digunakan sebagai parameter kaedah pengawal. Selain itu, tiga parameter adalah istimewa: Setiap satu menambah fungsi unik pada aplikasi anda:
_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 As anda boleh lihat, parameter ini digunakan untuk menentukan pengawal mana yang hendak dilaksanakan "apabila laluan sepadan". |
_controller
yang menunjukkan pengawal yang harus dilaksanakan apabila laluan sepadan. Parameter ini menggunakan corak rentetan ringkas yang dipanggil nama pengawal logik, yang Symfony gunakan untuk memetakan kaedah atau kelas PHP tertentu. Corak ini mempunyai tiga bahagian, dipisahkan oleh titik bertindih: #🎜🎜##🎜🎜#bundle:controller:action#🎜🎜##🎜🎜#Anggap, a< The nilai code>_controller ialah
AppBundle:Blog:show
yang bermaksud: #🎜🎜#Himpunan | Kelas Pengawal | Nama Kaedah | #🎜🎜# < /thead>
---|---|---|
AppBundle #🎜🎜# | BlogController #🎜🎜# | showAction #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Pengawal mungkin kelihatan seperti ini: rrreeePerhatikan bahawa Symfony menambah rentetan 你也可以使用它的FQCN类名及方法来指定这个类: 除了使用逻辑名和FQCN类名之外,Symfony也支持第三种指定控制器的方式。这种方式只使用一个冒号分隔(如 路由参数和控制器参数 ¶路由参数(如 现实中, 换句话说,对于控制器方法的每个参数,Symfony2都会根据该名称来查找路由参数,并将其值指向到控制器作为参数。在上面的高级示例当中,下列变量的任何组合(以任意方式)都被用作
占位符和 你也可以使用指定的 AppBundleControllerBlogController::showAction . Tetapi jika anda mengikuti beberapa konvensyen penamaan yang mudah, nama logik akan menjadi lebih mudah dan lebih fleksibel. Selain menggunakan nama logik dan nama kelas FQCN, Symfony turut menyokong spesifikasi ketiga cara pengawal. Pendekatan ini hanya menggunakan pembatas bertindih (seperti service_name:indexAction ) dan merujuk pengawal sebagai perkhidmatan (lihat Cara mentakrifkan pengawal sebagai perkhidmatan). #🎜🎜##🎜🎜##🎜🎜#Parameter penghalaan dan parameter pengawal ¶#🎜🎜#Parameter penghalaan (seperti{slug} adalah sangat penting kerana Ia adalah semua digunakan sebagai parameter untuk kaedah pengawal: #🎜🎜#rrreee#🎜🎜#Sebenarnya, set showAction() : #🎜🎜#
default digabungkan bersama, malah pembolehubah $_controller tersedia. Butiran lanjut dibincangkan parameter ke dalam pengawal #🎜🎜##🎜🎜#Anda juga boleh melakukan ini menggunakan Anda juga boleh menentukan maklumat tambahan dalam laluan anda dan mengaksesnya dalam pengawal anda. Untuk maklumat lanjut sila baca Cara menghantar maklumat tambahan dari laluan ke pengawal Jana URL ¶Sistem penghalaan juga digunakan untuk menjana URL. Pada hakikatnya, penghalaan ialah sistem dua hala: memetakan URL kepada pengawal + parameter dan laluan pemetaan + parameter kembali ke URL. Kaedah 要生成一个URL,你需要指定路由的名称(如 在控制器中你没有继承symfony的父类Controller,那么你不可以使用 在即将到来的部分中,你将学会如何在模板中生成URL地址。 如果你的应用程序前端使用的是ajax请求,你可能希望根据你的路由配置,在JavaScript中生成URL。通过使用FOSJsRoutingBundle,你就可以做到: rrreee更多信息请阅读这个bundle文档。 生成带有Query Strings的URL ¶这个 在模板里生成URL ¶在应用程序页面之间进行连接时,最常见的地方就是从模板中生成URL。这样做其实和以前一样,但是使用的是一个模板助手函数: rrreeerrreee生成绝对的URL ¶默认情况下,路由器会产生相对的URL(如 在模板引擎Twig中,要使用 blog_show ) dan sebarang kad liar (seperti slug = catatan-blog saya ). Dengan maklumat ini, sebarang URL boleh dijana dengan mudah:rrreeeDalam pengawal, jika anda tidak mewarisi Pengawal kelas induk symfony, maka anda tidak boleh menggunakan kaedah pintasangenerateUrl() , tetapi anda boleh menggunakan kaedah perkhidmatan generate() penghala:rrreee Dalam bahagian yang akan datang, anda akan belajar cara menjana alamat URL dalam templat.Jika bahagian hadapan aplikasi anda menggunakan permintaan ajax, anda mungkin mahu menjana URL dalam JavaScript berdasarkan konfigurasi penghalaan anda. Dengan menggunakan FOSJsRoutingBundle, anda boleh melakukan: rrreee Sila baca dokumen bundle ini untuk mendapatkan maklumat lanjut.Jana URL dengan Rentetan Pertanyaan ¶🎜IniJana URL dalam templat ¶🎜Tempat yang paling biasa untuk menyambung antara halaman aplikasi ialah menjana URL daripada templat. Melakukan ini sebenarnya sama seperti sebelumnya, tetapi menggunakan fungsi pembantu templat: 🎜rrreeerrreeeJana URL mutlak ¶< / h3>🎜Secara lalai, penghala akan menjana URL relatif (seperti |