Laravel 5 应用程序中的动态路由路线页面控制器方法

2022-08-30 21:03:04

我希望有人能帮助我为可以有多个段的URL进行动态路由。我一直在网络上进行一些搜索,但我找不到任何东西可以帮助我解决我的具体情况。

一点背景...几年前,我为自定义客户端网站开发了一个CMS包,该包是在CodeIgniter上构建的。此CMS软件包具有多个模块(页面,博客,日历,查询等)。对于 Pages 模块,我将路由缓存到一个“自定义路由”配置文件,该文件将页面的完整路由(包括父路由、祖父路由等)与页面的 ID 相关联。我这样做是为了不必执行数据库查找来查找要显示的页面。

我目前正在使用Laravel(5.1)重建这个CMS软件包[当我学习Laravel时]。我需要先弄清楚路由情况,然后才能在新版本的软件包中继续使用我的Pages模块。

我知道我可以做这样的事情...

// routes.php
Route::get('{slug}', ['uses' => 'PageController@view']);

// PageController.php
class PageController extends Controller
{
    public function view($slug)
    {
        // do a query to get the page by the slug
        // display the view
    }
}

如果我不允许嵌套页面,这将起作用,但我这样做了。我只根据父级强制实施 slug 的唯一性。因此,可能有多个页面带有法戈的鼻涕虫...

  • 位置/法戈
  • 员工/法戈

与我使用CodeIgniter构建的软件包一样,我希望能够避免额外的数据库查找来找到要显示的正确页面。

我最初的想法是创建一个配置文件,该文件将具有动态路由,就像我对旧版本的系统所做的那样。路由只会在特定时间更改(当创建页面时,当修改 slug 时,当父级更改时),因此“缓存”它们将非常有效。但我对Laravel还是新手,所以我不确定最好的方法是什么。

我确实设法弄清楚以下路线有效。但这是设置它的最佳方法吗?

Route::get('about/foobar', function(){
    return App::make('\App\Http\Controllers\PageController')->callAction('view', [123]);
});

Route::get('foobar', function(){
    return App::make('\App\Http\Controllers\PageController')->callAction('view', [345]);
});

基本上,我想在创建页面时(或更改辅助信息组或父级)将特定路由绑定到特定的页面 ID。

我只是把事情复杂化了吗?

任何有关这方面的帮助或指导将不胜感激。

谢谢!


答案 1

我处理这个问题的方式是使用两个路由,一个用于主页(通常包含更复杂的逻辑,如新闻,拾取文章,横幅等),另一个用于任何其他页面的捕获。

路线

// Home page
Route::get('/', [
    'as'      => 'home',
    'uses'    => 'PageController@index'
]);

// Catch all page controller (place at the very bottom)
Route::get('{slug}', [
    'uses' => 'PageController@getPage' 
])->where('slug', '([A-Za-z0-9\-\/]+)');

上面要注意的重要部分是路由末端链接的方法。这允许您为路由参数声明正则表达式模式匹配。在这种情况下,我允许为参数使用字母数字字符,连字符和正斜杠。->where(){slug}

这将匹配像
test-page
test-page/sub-page
another-page/sub-page

页面控制器方法

public function index()
{
    $page = Page::where('route', '/')->where('active', 1)->first();

    return view($page->template)
        ->with('page', $page);
}

public function getPage($slug = null)
{
    $page = Page::where('route', $slug)->where('active', 1);

    $page = $page->firstOrFail();

    return view($page->template)->with('page', $page);
}

我将模板文件信息保存在数据库中,因为我允许用户在内容管理系统中创建模板。

然后,来自数据库上查询的响应将传递到视图,在该视图中,它可以输出到元数据、页面、痕迹导航等。


答案 2

我也在寻找相同的答案,即在laravel中创建动态路由,我想出了这个:在路由中.php

<?php


/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/

$str=Request::url();
$del="/public/";
$pos=strpos($str, $del);
$important1=substr($str, $pos+strlen($del), strlen($str)-1);
$important=ucfirst($important1); 
$asif=explode("/", $important);
$asif1=explode("/", $important1);
//echo $important;
$post=$asif1[0];
$post1=$asif1[1];
if(isset($asif1[2]))
{
   $post2=$asif1[2];
}
if(!(isset($post2)))
{
   Route::match(array('GET','POST'),$important1, $asif[0].'Controller@'.$asif[1]);
}
if(isset($post2))
{      Route::match(array('GET','POST'),$post.'/'.$post1.'/{id}',$asif[0].'Controller@'.$asif[1]);
}
Route::get('/', function () {
    return view('welcome');
});

前任

如果你有后控制器与方法你好在拉拉维尔。您可以使用此网址 http://localhost/shortproject/public/post/hello。其中 shortproject 是您的项目文件夹名称。


推荐