Voyager - laravel管理面板

时间:2016-12-14 16:22:12

标签: laravel-routing

我的问题与Voyager管理面板中的控制器有关。例如,我创建了一个包含迁移的表。它的名字是" groups"然后我创建了BREAD并将其添加到Voyager中的菜单中。

我创建了一个文件夹,其名称为" groups"在\ resources \ views \ vendor \ voyager中,然后我创建了两个文件来覆盖视图。

但我不知道控制器在哪里。我用php artisan make:controller GroupsController创建了控制器。我猜这个控制器与旅行者控制器无关。

我想更改索引或创建方法并将一些数据传递给控制器​​中的视图,但我不知道它在哪里。

我在\ vendor \ tcg \ voyager \ src \ Http \ Controllers中创建了一个控制器,它的名字是VoyagerGroupsController.php但是当我在其中创建类和索引方法时,它不起作用。

如何为"群组创建控制器"并将数据传递给视图?

3 个答案:

答案 0 :(得分:3)

每当我们在voyager中创建一个表时,Voyager就会将其称为数据类型。对于我们创建的所有表/数据类型,Voyager用户只有一个控制器 VoyagerBreadController.php 位于** vendor \ tcg \ voyager \ src \ Http \ Controllers **。

例如,如果我创建一个名为 brands 的表格。 Laravel将使用控制器 VoyagerBreadController

但是使用或指向此控制器的路线在哪里。路由位于文件 vendor \ tcg \ voyager \ routes \ voyager.php 中。在此文件中,找到以下行:

try {
            foreach (\TCG\Voyager\Models\DataType::all() as $dataTypes) {
                Route::resource($dataTypes->slug, $namespacePrefix.'VoyagerBreadController');
            }
        } catch (\InvalidArgumentException $e) {
            throw new \InvalidArgumentException("Custom routes hasn't been configured because: ".$e->getMessage(), 1);
        } catch (\Exception $e) {
            // do nothing, might just be because table not yet migrated.
        }

在我的版本中,这些行位于第29至37行之间。

如您所见,上面的代码是获取所有数据类型并为我们的表/数据类型创建资源路由。

现在,如果我想覆盖这条路线,并创建一条路线,让我自己的控制器用于特定的动作。例如,如果我想为品牌/创建网址创建路线。我可以通过简单地在上面的代码下面添加以下行(我的路线)来实现这一点(即在第37行之后):

Route::get('brands/create', function(){return 'abc';})->name('brands.create');

或者你可以在Voyager :: routes()之后在 routes \ web.php 中添加以下行来做同样的事情;

Route::get('brands/create', function(){return 'abc';})->name(**'voyager.brands.create'**);

答案 1 :(得分:0)

因为现在使用的是App控制器而不是Voyager控制器,所以您必须覆盖完整的控制器

喜欢

在config / voyager.php中添加

'controllers' => [
'namespace' => 'App\\Http\\Controllers',
],

在App / controller中创建新的控制器,例如MyBreadController.php

<?php

namespace App\Http\Controllers;
class MyBreadController extends \TCG\Voyager\Http\Controllers\Controller
{
//code here
}

app/Providers/AppServiceProvider.php

use TCG\Voyager\Http\Controllers\VoyagerBreadController;
use App\Http\Controllers\MyBreadController;
public function register()
{
$this->app->bind(VoyagerBreadController::class, MyBreadController::class);
//
}

答案 2 :(得分:-1)

如您在routes / web.php中所述,我添加了Route :: get(&#39; groups&#39;,&#39; GroupsController @ index&#39;)

像这样

路由::群组([&#39;前缀&#39; =&gt;&#39; admin&#39;],function(){     旅行者::路线();

Route::get('groups', 'GroupsController@index');

});

并在索引方法

中添加这些行

公共功能索引(请求$请求){

    // GET THE SLUG, ex. 'posts', 'pages', etc.
    $slug = $this->getSlug($request);

    // GET THE DataType based on the slug
    $dataType = DataType::where('slug', '=', $slug)->first();

    // Check permission
    Voyager::can('browse_'.$dataType->name);

    // Next Get the actual content from the MODEL that corresponds to the slug DataType
    $dataTypeContent = (strlen($dataType->model_name) != 0)
        ? app($dataType->model_name)->latest()->get()
        : DB::table($dataType->name)->get(); // If Model doest exist, get data from table name

    $view = 'voyager::bread.browse';

    if (view()->exists("voyager::$slug.browse")) {
        $view = "voyager::$slug.browse";
    }

    return view($view, compact('dataType', 'dataTypeContent'));

}

但是getSlug方法不起作用。将显示此错误 GroupsController.php第23行中的ErrorException: 试图获得非对象的属性

我想重写控制后getSlug()不起作用,我必须手动设置slug $ slug =&#39; groups&#39 ;;