Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel从Mysql数据库创建到控制器的动态路由_Php_Laravel_Laravel 4 - Fatal编程技术网

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

Php Laravel从Mysql数据库创建到控制器的动态路由,php,laravel,laravel-4,Php,Laravel,Laravel 4,我有下表:使用页面名route name对mysql数据库中的页面进行分组: id name route -------------------- 0 About about 1 Contact contact 2 Blog blog 我想做的是在my:routes.php中创建动态路由 例如,如果我转到以下位置:/about它将转到AboutController.php(将动态创建),这可能吗?是否可以创

我有下表:使用页面名route name对mysql数据库中的页面进行分组:

   id   name      route
  --------------------
    0   About      about
    1   Contact    contact
    2   Blog       blog
我想做的是在my: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 
然后创建
页面
雄辩
模型:

class Page extends Eloquent {
    // ...
}
然后为
CRUD
创建
控制器
,您可以使用
资源
控制器或普通控制器,例如,通常是
页面控制器

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);
    }
}
视图/page/index.blade.php
视图文件:

@extends('layouts.master')
{{-- Add other parts, i.e. menu --}}
@section('content')
    {{ $page->page_content }}
@stop
要显示页面,请创建如下路由:

// could be page/{slug} or only slug
Route::get('/{slug}', array('as' => 'page.show', 'uses' => 'PageController@show'));
http://example.com/home
http://example.com/about
要访问页面,您可能需要如下
url/link

// could be page/{slug} or only slug
Route::get('/{slug}', array('as' => 'page.show', 'uses' => 'PageController@show'));
http://example.com/home
http://example.com/about
这是一个粗略的想法,尝试实现类似的功能。

试试看

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个小时,通过谷歌和Laravel的资源挖掘后,我想出了这个解决方案,我认为它效果最好,看起来最干净。不需要重定向和多个内部请求

将此路由添加到路由文件的最底部。 如果没有匹配的其他路由,则执行此操作。在闭包中,您决定执行哪个控制器和操作。 最好的部分是——所有路由参数都传递给操作,方法注入仍然有效。控制员显示器线路来自Laravel Route(r?)等级

我的示例将处理两种情况——首先检查用户是否以该名称存在,然后检查slug是否可以找到一篇文章

Laravel 5.2(下文第5.3条)

5.3更改了控制器的调度方式

这是我的动态控制器5.3,5.4的例子


希望这有帮助

有一个组件可用,可用于在数据库中存储路由。作为一个额外的优势,此组件仅加载当前活动路由,因此它提高了性能,因为并非所有路由都加载到内存中

按照自述文件中提供的安装说明进行操作

在数据库中存储路由

// For route path this can come from your database.
$paths = ['path_one','path_two','path_three'];
// Then iterate the router "get" method.
foreach($paths as $path){
    $router->resource($path, 'YourController');
}
这里只需要将
RouteManager
注入到例如cli命令中。使用
addRoute
可以告诉
RouteManager
将路由存储到数据库中。您可以轻松地更改此代码,并使用自己的页面或其他数据存储库来构建路由

使用Douma\Routes\Contracts\RouteManager;
类RoutesGenerateCommand和extends命令
{
受保护的$signature='路由:生成';
私人$routeManager;
公共函数构造(RouteManager$RouteManager)
{
$this->routeManager=$routeManager;
}
公共函数句柄()
{
$this->routeManager->addRoute(
新路由('/my Route',false,'myroute',MyController::class,'index')
);
}
}
每隔2-5分钟或在数据更改后运行此cli命令,以确保路由是最新的

在App\Http\Kernel.php中注册RouteMiddle软件

\Douma\Routes\Middleware\RouteMiddleware::class

清空你的web.php

如果已定义任何Laravel管线,请确保清空此文件

使用数据库中的路由

// For route path this can come from your database.
$paths = ['path_one','path_two','path_three'];
// Then iterate the router "get" method.
foreach($paths as $path){
    $router->resource($path, 'YourController');
}
您可以使用刀片服务器中的路由:

{{ RouteManager::routeByName('myroute')->url() }}
或者,您可以将
RouteManager
-接口插入任何您想要获取路由的位置:

use Douma\Routes\Contracts\RouteManager;
class MyClass
{
    public function __construct(RouteManager $routeManager) 
    {
        $this->routeManager = $routeManager;
    }

    public function index()
    {
        echo $this->routeManager->routeByName('myroute')->url();
    }
}

有关更多信息,请参阅自述

我们可以通过这种方式制作动态路线

// Instanciate a router class.
$router = app()->make('router');
从数据库获取路由值

// For route path this can come from your database.
$paths = ['path_one','path_two','path_three'];
// Then iterate the router "get" method.
foreach($paths as $path){
    $router->resource($path, 'YourController');
}
然后迭代该值以生成动态路由

// For route path this can come from your database.
$paths = ['path_one','path_two','path_three'];
// Then iterate the router "get" method.
foreach($paths as $path){
    $router->resource($path, 'YourController');
}
您也可以使用GET | POST | PUT | PATCH | DELETE方法

// Then iterate the router "get" method.
foreach($paths as $path){
    $router->get($path, 'YourController@index')->name('yours.index');
}

你可以这样做。它非常适合我

use Illuminate\Container\Container;
use Illuminate\Routing\ControllerDispatcher;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
use Illuminate\Routing\Route as MainRoute;
use Illuminate\Routing\Router;

Route::group([
    'prefix'     => config('app.payment.route_prefix'),
    'namespace'  => config('app.payment.route_namespace'),
    'middleware' => config('app.payment.route_middleware')
], function (Router $router) {

    /**
     * Resolve target payment method controller
     *
     * @param $key Example key [paypal]
     * @param $action
     * @return mixed
     */
    $resolver = function ($key, $action) {
        $route = app(MainRoute::class);
        $container = app(Container::class);

        // Generate App\\Http\Controllers\PaymentMethods\PaypalController
        $controller = app(sprintf('%s\\%sController', config('app.payment.route_namespace'), ucfirst($key)));

        return (new ControllerDispatcher($container))->dispatch($route, $controller, $action);
    };

    $router->post('{key}/error', function ($key) use ($resolver) {
        return $resolver($key, 'error');
    });

    $router->post('{key}/success', function ($key) use ($resolver) {
        return $resolver($key, 'success');
    });

    $router->get('{key}', function ($key) use ($resolver) {
        return $resolver($key, 'index');
    });
});

但是为什么呢?无论如何,您必须编写控制器来完成这项工作,所以为什么不希望只在代码中编写路由,而不是增加数据库的工作负载呢?“动态创建”控制器是什么意思?我正在尝试创建动态页面?在管理员中,我可以添加这些页面-name,我需要这样做,这样我就可以为用户分配权限,让他们在登录时可以访问他们可以查看的页面来动态添加这些页面,或者我必须进入我的routes.php并一个接一个地添加这些控制器?但所有这些页面都将只包含一些内容(文本、图像)没有表单和内容?这就是为什么很难做到这一点,它混合了文本内容和表单等。例如,如果用户登录并转到/about(如果他有权限),那么他可以访问目录/about下的所有页面,如/about/index、/about/page2等。谢谢,slug的意思是什么,例如目录名“/about”?它是数据库中的标识符,例如,
about
将是一个slug,通过
slug
字段来标识数据库中的about页面。但是对于路由,我需要以“page/{slug}”开头吗?我们可以只做“{slug}”吗?是的,您可以只使用
{page}
@TheAlpha非常感谢这位伙伴,帮了我大忙!我正在寻找相同的功能。有没有什么想法可以在laravel 5.7上使用?它可以工作:)有没有想法如何将参数传递给“myAction”方法?工作得很好,谢谢-唯一的问题是当它到达第二个控制器时必须重新运行相同的查询才能再次获得模型。有没有办法围绕这一点?@anthonyroberts您是在谈论方法参数中的模型绑定吗?您可能需要深入了解框架的内部,使用xdebug逐步了解并了解是否有避免这种情况的方法