Laravel 从 Mysql 数据库创建到控制器的动态路由

2022-08-30 14:35:28

我有下表:group_pages mysql数据库中的页面名称路由名称:

   id   name      route
  --------------------
    0   About      about
    1   Contact    contact
    2   Blog       blog

我正在尝试做的是在我的中创建动态路由:路由.php ?

例如,如果我去哪里:它将去(将动态创建)是可能的吗?是否可以创建动态控制器文件?/aboutAboutController.php

我正在尝试创建链接到控制器的动态页面路由

示例我想在我的动态生成这个routes.php

Route::controller('about', 'AboutController');

Route::controller('contact', 'ContactController');

Route::controller('blog', 'BlogController');

答案 1

这不是创建动态页的正确方法,相反,您应该使用数据库并将所有页保留在数据库中。例如:

// Create pages table for dynamic pages
id | slug | title | page_content 

然后创建模型:PageEloquent

class Page extends Eloquent {
    // ...
}

然后创建 for ,您可以使用控制器或普通控制器,例如,通常为:ControllerCRUDresourcePageController

class PageController extends BaseController {

    // Add methods to add, edit, delete and show pages

    // create method to create new pages
    // submit the form to this method
    public function create()
    {
        $inputs = Input::all();
        $page = Page::create(array(...));
    }

    // Show a page by slug
    public function show($slug = 'home')
    {
        $page = page::whereSlug($slug)->first();
        return View::make('pages.index')->with('page', $page);
    }
}

视图文件:views/page/index.blade.php

@extends('layouts.master')
{{-- Add other parts, i.e. menu --}}
@section('content')
    {{ $page->page_content }}
@stop

要显示页面,请创建如下所示的路由:

// could be page/{slug} or only slug
Route::get('/{slug}', array('as' => 'page.show', 'uses' => 'PageController@show'));

要访问页面,您可能需要如下所示:url/link

http://example.com/home
http://example.com/about

这是一个粗略的想法,尝试实现这样的东西。


答案 2

在花了2个小时,挖掘了谷歌和Laravel源代码之后,我想出了这个解决方案,我认为它效果最好,看起来最干净。无需重定向和多个内部请求。

将此路由添加到路由文件的最底部。如果没有其他匹配的路由,则执行此操作。在闭包中,您可以决定要执行的控制器和操作。最好的部分是 - 所有路由参数都传递给操作,并且方法注入仍然有效。ControllerDispatcer线来自Laravel Route(r?)类。

我的示例将处理 2 种情况 - 首先检查用户是否存在该名称,然后检查 slug 是否可以找到文章。

Laravel 5.2 (5.3以下)

Route::get('{slug}/{slug2?}', function ($slug) {
    $class = false;
    $action = false;

    $user = UserModel::where('slug', $slug)->first();
    if ($user) {
        $class = UserController::class;
        $action = 'userProfile';
    }

    if (!$class) {
        $article= ArticleModel::where('slug', $slug)->first();
        if ($article) {
            $class = ArticleController::class;
            $action = 'index';
        }
    }

    if ($class) {
        $route = app(\Illuminate\Routing\Route::class);
        $request = app(\Illuminate\Http\Request::class);
        $router = app(\Illuminate\Routing\Router::class);
        $container = app(\Illuminate\Container\Container::class);
        return (new ControllerDispatcher($router, $container))->dispatch($route, $request, $class, $action);
    }

    // Some fallback to 404
    throw new NotFoundHttpException;
});

5.3 更改了控制器的调度方式。

这是我的 5.3、5.4 动态控制器示例

namespace App\Http\Controllers;


use Illuminate\Routing\Controller;
use Illuminate\Routing\ControllerDispatcher;
use Illuminate\Routing\Route;

class DynamicRouteController extends Controller
{
    /**
     * This method handles dynamic routes when route can begin with a category or a user profile name.
     * /women/t-shirts vs /user-slug/product/something
     *
     * @param $slug1
     * @param null $slug2
     * @return mixed
     */
    public function handle($slug1, $slug2 = null)
    {
        $controller = DefaultController::class;
        $action = 'index';

        if ($slug1 == 'something') {
            $controller = SomeController::class;
            $action = 'myAction';
        }

        $container = app();
        $route = $container->make(Route::class);
        $controllerInstance = $container->make($controller);

        return (new ControllerDispatcher($container))->dispatch($route, $controllerInstance, $action);
    }
}

希望这有帮助!


推荐