laravel高级路由到多个控制器

时间:2015-08-11 18:51:55

标签: laravel routes middleware

我在这两条路线的中间件中,所以它们保持在所有其他路线之上

Route::get('{slug?}', array(
    'as' => 'homeIndex',
    'uses' => 'Modules\\Pages\\Controllers\\Pages@index'
))->where('slug', '(.*)?');


Route::get('{company?}', array(
    'as' => 'companyProfile',
    'uses' => 'Modules\\Company\\Controllers\\Profile@index'
))->where('company', '(.*)?');

我想要实现的目标是通过homeIndex路由所有网页,并且所有公司都会在第一段中通过companyProfile进行全局分析。

页面工作正常,但对于公司资料我得到404。

与facebook相同,如果你去facebook.com/关于结果是关于页面,如果你用你的唯一名称替换你得到你的个人资料。

任何想法如何使其发挥作用?

1 个答案:

答案 0 :(得分:0)

Facebook可行,因为about是一条路线。这是有效的,因为您的唯一名称永远不会是about。因此,他们首先查找about路由,如果该段不是about,则他们知道它可能是唯一的名称。

你的应用程序不同,因为你的应用程序不知道你的第一个细分是一个slu or还是一个公司,所以你需要一些方法来区分它。如果您将所有内容重定向到单个函数,那么在该函数中执行了一些查询或任何您需要做的以确定第一个段是slug还是公司名称,然后适当地重定向它,它将起作用。

Laravel从上到下读取路线。当你点击路线/some-random-company时,Laravel不知道这是一家公司。所有它知道它碰巧匹配第一条路线,所以它与你的公司一起击中了slug路线。因此,另一个解决方案是更新路由上的where,以便Laravel知道传入的路由参数是slug还是公司,并且知道将该请求路由到哪里。

我对正则表达式很糟糕,我不知道你是如何制作slu or的,或者你是否有任何关于公司名称能够或不能构成的规则。您需要做的是确定是否存在可以准确确定路径参数是slug还是公司的位置。例如,如果它有一个或多个-,它可能是一个slug。

然后你必须编写一个正则表达式模式来查找多个-,然后将该模式放入slug路由的where。然后,如果路由参数是公司,并且它与寻找-中的一个或多个的模式不匹配,则Laravel将知道将此请求与公司路线匹配。

如果您无法使用任何内容确定字符串是slug还是公司,则必须更新路线,使其看起来像company/{company?}slug/{slug?},然后输出您的链接适当。通过这种方式,Laravel将确定在何处路由该流量。