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');
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.
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!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']);
}
}
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