我想为我的Laravel应用创建动态页面CMS。管理员可以为任何页面提供任何URI,例如,他可以创建包含one/two/three
URI的页面,http://example.com/one/two/three将指向此站点。我已经发现可以为多级网址添加单一路由,如下所示:
get('{uri}', 'PageController@view')->where('uri', '.+');
现在,我还想让/{username}
个网址指向用户个人资料。这意味着,如果我需要让它一起工作。对我来说,完美的代码将是这样的:
get('{username}', 'ProfileController@view');
get('{uri}', 'PageController@view')->where('uri', '.+');
然后,在ProfileController中,我想让我的路线走得更远,就像它不在那里一样。像这样:
// ProfileController
public function view()
{
$user = User::whereUsername($username)->first();
if ($user === null) {
// Go to the next route.
}
}
可以用Laravel完成吗?
我可以想到另一个解决方案,只是为用户名和页面uris映射提供动态路由控制器,但我更愿意将它作为单独的路由。
答案 0 :(得分:0)
如果$user
为null
,您可以从服务容器中解析新的PageController实例。
// ProfileController
public function view()
{
$user = User::whereUsername($username)->first();
if ($user === null) {
// Go to the next route.
$params = []; // If your view method on the PageController has any parameters, define them here
$pageController = app(PageController::class);
return $pageController->callAction('view', $params)
}
}
这样,{username}路由将保留,但会显示管理员定义的自定义内容。
修改强>
如果您不想手动调用控制器,则可以在定义路径之前分析当前URL段并检查现有用户。为了不使您的routes.php
文件过于复杂,我会添加一个专门的服务类来分析您的网址细分:
App\Services\RouteService.php:
<?php
namespace App\Services;
class RouteService {
public static function isUserRoute()
{
if(count(Request::segments()) == 1)
return !! User::whereUsername(Request::segment(1))->first();
}
return false;
}
}
routes.php:
<?php
use App\Services\RouteService;
if(RouteService::isUserRoute())
{
get('{username}', 'ProfileController@view');
}
get('{uri}', 'PageController@view')->where('uri', '.+');
我没有对此进行测试,但它应该可行。根据您的需要调整RouteService类。
我正在使用我的CMS中的第一种方法,它确实很有效。唯一的区别是我编写了一个处理所有传入请求的Job,并分别调用控制器操作。