Laravel Создание динамических маршрутов для контроллеров из базы данных Mysql

У меня есть следующая таблица: group_pages в базе данных mysql с именем имени страницы:

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

что я пытаюсь сделать, это создать динамические маршруты в моем: routes.php?

Где, если я иду к примеру: /about этом перейдет в AboutController.php (который будет создан динамически), возможно ли это? возможно ли создать файл динамического контроллера?

Я пытаюсь создать маршруты динамических страниц, которые ссылаются на контроллер

Например, я хочу генерировать это динамически в моих routes.php

 Route::controller('about', 'AboutController'); Route::controller('contact', 'ContactController'); Route::controller('blog', 'BlogController'); 

Это не правильный способ создания динамических страниц, вы должны использовать базу данных и хранить все страницы в базе данных. Например:

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

Затем создайте Page Eloquent model:

 class Page extends Eloquent { // ... } 

Затем создайте Controller для 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); } } 

views/page/index.blade.php представлений views/page/index.blade.php :

 @extends('layouts.master') {{-- Add other parts, ie 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 часа, вырываясь через источник google и 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); } } 

Надеюсь это поможет!

пытаться

 Route::get('/', ['as' => 'home', 'uses' => 'HomeController@index']); $pages = Cache::remember('pages', 5, function() { return DB::table('pages') ->where('status', 1) ->lists('slug'); }); if(!empty($pages)) { foreach ($pages as $page) { Route::get('/{'.$page.'}', ['as' => $page, 'uses' => 'PagesController@show']); } }