Laravel tworzenie dynamicznych tras do kontrolerów z bazy danych Mysql

Mam następującą tabelę: group_pages w bazie mysql o nazwie strony nazwa trasy:

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

Staram się tworzyć dynamiczne trasy w my: routes.php ?

Gdzie jeśli przejdę do na przykład: {[2] } przejdzie do AboutController.php (które będą tworzone dynamicznie) czy jest to możliwe? czy można utworzyć plik kontrolera dynamicznego?

Staram się tworzyć dynamiczne strony, które łączą się z kontrolerem

Przykład chcę wygenerować to dynamicznie w moim routes.php

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

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

Route::controller('blog', 'BlogController');
Author: Ariful Haque, 2014-04-18

3 answers

To nie jest właściwy sposób na tworzenie dynamicznych stron zamiast tego, powinieneś użyć bazy danych i zachować wszystkie strony w bazie danych. Na przykład:

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

Następnie utwórz Page Eloquent model:

class Page extends Eloquent {
    // ...
}

Następnie utwórz Controller dla CRUD, możesz użyć kontrolera resource lub zwykłego kontrolera, na przykład normalnie a 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);
    }
}

Plik widoku views/page/index.blade.php:

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

Aby pokazać strony Utwórz trasę w ten sposób:

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

Aby uzyskać dostęp do strony, możesz wymagać url/link Jak to:

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

To jest szorstki pomysł, spróbuj wdrożyć coś takiego.

 25
Author: The Alpha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-29 16:58:04

Po spędzeniu 2 godzin, przekopując się przez Google i Laravel source, wymyśliłem to rozwiązanie, które moim zdaniem działa najlepiej i wygląda najczystiej. Nie ma potrzeby przekierowań i wielu wewnętrznych żądań.

Dodajesz tę trasę na samym dole plików tras. Jeśli żadna inna trasa nie jest dopasowana, jest ona wykonywana. W zamykaniu decydujesz, który kontroler i akcję wykonać. Najlepsze jest to, że wszystkie parametry trasy są przekazywane do akcji, a metoda wtrysku nadal działa. Na Z Laravel Route (r?) klasy.

Mój przykład obsłuży 2 przypadki - najpierw sprawdza, czy użytkownik istnieje o tej nazwie, a następnie sprawdza, czy artykuł może zostać znaleziony przez ślimaka.

Laravel 5.2 (5.3 poniżej)

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 zmienił sposób wysyłania kontrolera.

Oto mój przykład kontrolera dynamicznego dla 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);
    }
}
Mam nadzieję, że to pomoże!
 6
Author: Mārtiņš Briedis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-04 15:00:09

Try

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']);
   }
}
 2
Author: Ali Elsayed Salem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-05 13:42:39