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)
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
34469 次 |
| 最近记录: |