我的问题与Voyager管理面板中的控制器有关。例如,我创建了一个包含迁移的表。它的名字是“组”,然后我创建了BREAD并将其添加到Voyager中的菜单中。
我在\ resources \ views \ vendor \ voyager中创建了一个名为“groups”的文件夹,然后我创建了两个文件来覆盖视图。
但我不知道控制器在哪里。我用php artisan make:controller GroupsController创建了控制器。我猜这个控制器与旅行者控制器无关。
我想更改索引或创建方法并将一些数据传递给控制器中的视图,但我不知道它在哪里。
我在\ vendor \ tcg \ voyager \ src \ Http \ Controllers中创建了一个控制器,它的名字是VoyagerGroupsController.php但是当我在其中创建类和索引方法时,它不起作用。
如何为“组”创建控制器并将数据传递给视图?
每当我们在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'**);
因为它现在使用你的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);
//
}
我在routes / web.php中添加了Route :: get('groups','GroupsController @ index')
像这样
Route :: group(['prefix'=>'admin'],function(){Voyager :: routes();
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方法不起作用。在GroupController.php第23行中将显示此错误ErrorException:尝试获取非对象的属性
我想重写控制后getSlug()不起作用,我必须手动设置slug $ slug ='groups';