当前位置: 首页 > 后端技术 > PHP

LuthierCIRoutingRoutes

时间:2023-03-29 15:56:29 PHP

Routing(Routes)目录(Contents)IntroductionIntroductionRouteTypeRoutetypesSyntaxSyntaxNamespacesPrefixPrefixesNamedroutesCallbacksasroutesCallbacksasroutesGroups资源路由资源路由默认控制器默认控制器参数ParametersOptionalParametersOptionalparametersParametersRegularExpressionsParameterregex"Sticky"parameters"Sticky"parametersIntroduction(简介)LuthierCI改变了CodeIgniter路由的行为:在CodeIgniter中,默认情况下,可以在任何HTTP动词下访问路由。使用LuthierCI时,必须为每个路由定义可接受的HTTP动词,任何不匹配这些参数的请求都会产生404错误。在CodeIgniter中,可以直接从URL访问控制器而无需定义路由。另一方面,对于LuthierCI,尝试访问未定义的路径(即使URL与控制器的名称和方法匹配)将产生404错误。在CodeIgniter中,路由参数是指向控制器的简单正则表达式,而在LuthierCI中,路由是一个单独且唯一的实体,包含定义明确的参数以及从中构建URL的能力。在CodeIgniter中,您只能创建到控制器的路由。使用LuthierCI可以使用匿名函数作为控制器,甚至可以在不使用单个控制器的情况下构建完整的Web应用程序。路由类型(Routetypes)可以使用三种路由:HTTP路由:在HTTP请求下访问,定义在application/routes/web.php文件中AJAX路由:只在AJAX请求下访问,被访问CLI下路由定义在application/routes/api.php文件中:只在CLI(命令行界面)环境下访问,AJAX路由定义在application/routes/cli.php文件中进入api.php虽然你可以在网络上。php文件,但是如果你用相同的URL和相同的HTTP动词定义两个或多个路由,那么最好做api.php,第一个路由将返回ALWAYSLuthierCI允许你使用动词GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS和TRACE定义HTTP路由:语法(Syntax)如果你用过Laravel,那么你就会知道如何使用LuthierCI,因为它的语法是一样的。这是最简单的路由示例:Route::get('foo','bar@baz');第一条路由获胜,其中foo是路由的URL,bar@baz是它指向的控制器和方法的名称(由@分隔)。通过使用get()方法,您告诉LuthierCI该路由将在GET请求下可用。LuthierCI允许您使用动词GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS和TRACE定义HTTP路由:Route::post('foo','bar@baz');Route::put('foo','bar@baz');Route::patch('foo','bar@baz');Route::delete('foo','bar@baz');Route::head('foo','bar@baz');Route::options('foo','bar@baz');Route::trace('foo','bar@baz');此外,您可以将一个包含路由属性的数组作为第三个参数(稍后解释)。Route::get('test','controller@method',['prefix'=>'...','namespace'=>'...',(...)]);要在路由中接受多个HTTP动词,请使用以下match()方法:Route::match(['GET','POST'],'path','controller@method',[(...)]);namespace(Namespaces)命名空间属性告诉CodeIgniter控制器所在的子目录。(注意,这不是PHP命名空间,它是目录名)//控制器位于application/controllers/admin/Testcontroller.phpRoute::get('hello/world','testcontroller@index',['namespace'=>'admin']);前缀(Prefixes)使用前缀属性为路由添加前缀://URL将是'admin/hello/world'而不是'hello/world'Route::get('hello/world','testcontroller@index',['前缀'=>'管理员']);命名路由(Namedroutes)你可以(事实上,这是可取的)给你的路由起一个名字。这将允许您从其他地方调用它们:Route::get('company/about_us','testcontroller@index')->name('about_us');要通过名称获取路由,请使用route()函数,其第一个参数是路由的名称,第二个可选参数是一个数组,其中包含该路由的参数值。例如,要获取以前的路线,只需编写route('about_us')://http://example.com/company/about_us">我的链接!重复名称(Duplicatednames)不能调用两个或多个同名路由组(Groups)可以使用group()方法创建路由组,其中第一个参数是它们的公共前缀,第二个参数是一个带有子路由的匿名函数:Route::group('prefix',function(){Route::get('bar','test@bar');Route::get('baz','test@巴兹');});此外,可以将公共属性分配给路由组。下面是一个扩展语法的例子:Route::group('prefix',['namespace'=>'foo','middleware'=>['Admin','IPFilter']],function(){Route::get('bar','test@bar');路线::get('baz','test@baz');});资源路由资源路由允许您在一行中为控制器定义CRUD操作(创建、读取、更新、删除)示例:Route::resource('photos','PhotosController');生产:[名称][路径][动词][控制器操作]photos.indexphotosGETPhotosController@indexphotos.createphotos/createGETPhotosController@createphotos.storephotosPOSTPhotosController@storephotos.showphotos/{id}GETPhotosController@showphotos.editphotos/{id}/editGETPhotosController@editphotos.updatephotos/{id}PUT,PATCHPhotosController@updatephotos.destroyphotos/{id}删除PhotosController@destroy此外,还可以创建部分资源路由,传递包含要过滤的操作数组的第三个参数:Route::resource('photos','PhotosController',['index','edit','update']);生产:[名称][路径][动词][控制器动作]photos.indexphotosGETPhotosController@indexphotos.editphotos/{id}/editGETPhotosController@editphotos.updatephotos/{id}PUT,PATCHPhotosController@updateDefaultcontroller(默认控制器)LuthierCI自动将任何使用URL/和HTTP动词GET定义的路由设置为默认控制器,但您可以使用set()方法和此特殊语法显式设置它://请注意该值为绑定到CodeIgniter的特殊'default_controller'路由,你必须//使用原生语法:Route::set('default_controller','welcome/index');回调是路由(Callbacksasroutes)你可以使用匿名函数(也称为闭包或lambda函数)而不是指向控制器,例如:Route::get('foo',function(){ci()->load->view('some_view');});要在匿名函数中访问框架实例,请使用ci()函数参数(Parameters)参数可以在路由中定义,这样它们就可以是动态的。要将参数添加到路由的一部分,请将它们括在{花括号}Route::post('blog/{slug}','blog@post');Duplicatedparameters不能使用相同的Name调用两个或多个参数Optionalparameters(可选参数)要创建一个可选参数,添加一个?在右大括号之前:Route::put('categories/{primary?}/{secondary?}/{filter?}','clients@list');请注意,在定义了第一个可选参数之后,所有后续参数都必须是可选的。自动生成路由LuthierCI会为你生成一个包含所有可选参数的完整路径树,所以你不必担心写的路由比主路由多。Parameterregex(Parameterregex)您可以将参数限制为正则表达式://这些分别等同于(:num)和(:any):Route::get('cars/{num:id}/{any:注册}','CarCatalog@index');或者,您可以使用具有以下{([expr]):[name]}语法的自定义正则表达式://这等效于/^(es|en)$/Route::get('main/{((es|en)):_locale}/about','about@index');你可能需要的“粘性”参数("Sticky"parameters)在一组路由中定义一个参数,然后让那个参数在所有子路由中都可用,而不必在所有控制器中的所有方法的参数中定义它是很乏味的.考虑到这一点,LuthierCI提供了所谓的Sticky参数。粘性参数以下划线(_)开头并具有一些奇异性:它不会传递给路径指向的控制器方法的参数。在共享glue参数的所有子路由中,该值将从URL中获取,并自动在route()函数中提供,因此您可以省略它,或覆盖任何其他值。考虑这个例子:Route::group('shop/{_locale}',function(){Route::get('category/{id}','ShopCategory@categoryList')->name('shop.category');Route::get('product/{id}/details','ShopProduct@details')->name('shop.product.details');});路由shop.category和shop.product.detailsshared_locale粘性参数。虽然参数必须在URL中,但在此上下文中使用该函数时,route()不会强制其存在于参数值数组中。当您需要链接到当前路由的其他变体时,这尤其有用://如果URL是'shop/en/category/1',{_locale}在这里将是'en':echoroute('shop.category',['id'=>1]);#shop/en/category/1echoroute('shop.category',['id'=>2]);#shop/en/category/2echoroute('shop.category',['id'=>3]);#shop/en/category/3//您可以为任何其他值覆盖该值:echoroute('shop.category',['_locale'=>'es','id'=>1]);#shop/es/category/1粘性参数的一个优点是您不必将它们定义为指向控制器所有方法的参数。在前面的示例中,在ShopCategory和ShopProduct控制器中,它们的方法只有一个参数:$id,因为它是路由器提供的唯一参数:route->param('_locale');}}