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

use*_*060 25 php laravel laravel-4

我有下表:mysql数据库中的group_pages,页面名称为route name:

   id   name      route
  --------------------
    0   About      about
    1   Contact    contact
    2   Blog       blog
Run Code Online (Sandbox Code Playgroud)

我想要做的是在我的:routes.php中创建动态路由?

如果我去的例子:/about它会去AboutController.php(它将动态创建)可能吗?是否可以创建动态控制器文件?

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

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

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

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

Route::controller('blog', 'BlogController');
Run Code Online (Sandbox Code Playgroud)

The*_*pha 32

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

// Create pages table for dynamic pages
id | slug | title | page_content 
Run Code Online (Sandbox Code Playgroud)

然后创建Page Eloquent模型:

class Page extends Eloquent {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后创建 Controllerfor CRUD,你可以使用resource控制器或普通控制器,例如,通常是PageController:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

要显示页面,请创建如下路线:

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

要访问页面,您可能需要url/link这样:

http://example.com/home
http://example.com/about
Run Code Online (Sandbox Code Playgroud)

这是一个粗略的想法,尝试实现这样的事情.


Mār*_*dis 10

花了两个小时,通过谷歌和Laravel源码挖掘,我想出了这个解决方案,我觉得这个解决方案效果最好,看起来最干净.无需重定向和多个内部请求.

您可以在路径文件的最底部添加此路由.如果没有匹配其他路由,则执行此操作.在闭包中,您可以决定执行哪个控制器和操作.最好的部分是 - 所有路由参数都传递给action,方法注入仍然有效.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;
});
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!