我的问题与Voyager管理面板中的控制器有关。例如,我创建了一个包含迁移的表。它的名字是" groups"然后我创建了BREAD并将其添加到Voyager中的菜单中。
我创建了一个文件夹,其名称为" groups"在\ resources \ views \ vendor \ voyager中,然后我创建了两个文件来覆盖视图。
但我不知道控制器在哪里。我用php artisan make:controller GroupsController创建了控制器。我猜这个控制器与旅行者控制器无关。
我想更改索引或创建方法并将一些数据传递给控制器中的视图,但我不知道它在哪里。
我在\ vendor \ tcg \ voyager \ src \ Http \ Controllers中创建了一个控制器,它的名字是VoyagerGroupsController.php但是当我在其中创建类和索引方法时,它不起作用。
如何为"群组创建控制器"并将数据传递给视图?
答案 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 ;;