Laravel 背包 CRUD 不工作
Laravel Backpack CRUD not working
我按照 this 教程设置了一个 CRUD 示例。但我无法让它工作,我也不知道为什么。这是我的代码
SomeitemCrudController.php
<?php
namespace App\Http\Controllers\Admin;
use Backpack\CRUD\app\Http\Controllers\CrudController;
// VALIDATION: change the requests to match your own file names if you need form validation
use App\Http\Requests\SomeitemRequest as StoreRequest;
use App\Http\Requests\SomeitemRequest as UpdateRequest;
class SomeitemCrudController extends CrudController
{
public function setUp()
{
/*
|--------------------------------------------------------------------------
| BASIC CRUD INFORMATION
|--------------------------------------------------------------------------
*/
$this->crud->setModel("App\Models\Someitem");
$this->crud->setRoute("admin/someitem");
$this->crud->setEntityNameStrings('someitem', 'someitems');
/*
|--------------------------------------------------------------------------
| BASIC CRUD INFORMATION
|--------------------------------------------------------------------------
*/
$this->crud->setFromDb();
// $this->crud->setColumns(['nama']);
$this->crud->addField([
'nama' => 'Nama',
'keterangan' => 'Keterangan',
'harga' => 'Harga'
]);
}
public function store(StoreRequest $request)
{
$redirect_location = parent::storeCrud();
return $redirect_location;
}
public function update(UpdateRequest $request)
{
$redirect_location = parent::updateCrud();
return $redirect_location;
}
}
模特,Someitem.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Backpack\CRUD\CrudTrait;
class SomeItem extends Model
{
use CrudTrait;
//
protected $table = 'someitem';
protected $fillable = ['nama', 'keterangan', 'harga'];
public $timestamps = true;
}
请求,SomeitemRequest.php
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
class SomeitemRequest extends \Backpack\CRUD\app\Http\Requests\CrudRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return \Auth::check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// 'name' => 'required|min:5|max:255'
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
//
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
//
];
}
}
然后是路线
<?php
Route::group([
'prefix' => config('backpack.base.route_prefix', 'admin'),
'middleware' => ['admin'],
'namespace' => 'Admin'
], function() {
CRUD::resource('pelayanan', 'Admin\PelayananCrudController');
Route::get('/test', function () {
return view('welcome');
});
});
我可以成功访问http://localhost/myapp/public/admin/test
,但是我无法访问http://localhost/myapp/public/admin/someitem
,总是return错误500
我是 laravel(和 PHP)的新手,感谢您的帮助。谢谢!
我想让我的回答非常详细,所以我从头开始。我用的背包CRUD版本是^3.2.
看看这个文件your-project/vendor/backpack/crud/src/CrudServiceProvider.php
是的,我知道 class 名字不是 CRUD
,而是 CrudServiceProvider
。那是因为他们在 CrudServiceProvider
中有 register
方法并且在其中他们做 $loader->alias('CRUD', \Backpack\CRUD\CrudServiceProvider::class);
这使得 CRUD
class 成为 CrudServiceProvider
的别名。要了解有关其内部工作原理的更多信息,请阅读 Laravel Service Providers, Service Container and Facades.
所以我们发现CRUD::resource()
实际上是CrudServiceProvider::resource()
,所以进入这个方法,你会发现到目前为止只有一行return new CrudRouter($name, $controller, $options);
据我所知(如果我错了请纠正我)它叫做 Factory pattern/method. So go to CrudRouter
constructor (Github)。通读一遍。所以它所做的基本事情是代替这个
CRUD::resource('pelayanan', 'Admin\PelayananCrudController');
它会放这样的东西
Route::post('pelayanan/search', [
'as' => 'crud.pelayanan.search',
'uses' => 'Admin\PelayananCrudController@search',
]);
Route::get('pelayanan/reorder', [
'as' => 'crud.pelayanan.reorder',
'uses' => 'Admin\PelayananCrudController@reorder',
]);
Route::post('pelayanan/reorder', [
'as' => 'crud.pelayanan.save.reorder',
'uses' => 'Admin\PelayananCrudController@saveReorder',
]);
Route::get('pelayanan/{id}/details', [
'as' => 'crud.pelayanan.showDetailsRow',
'uses' => 'Admin\PelayananCrudController@showDetailsRow',
]);
Route::get('pelayanan/{id}/translate/{lang}', [
'as' => 'crud.pelayanan.translateItem',
'uses' => 'Admin\PelayananCrudController@translateItem',
]);
Route::get('pelayanan/{id}/revisions', [
'as' => 'crud.pelayanan.listRevisions',
'uses' => 'Admin\PelayananCrudController@listRevisions',
]);
Route::post('pelayanan/{id}/revisions/{revisionId}/restore', [
'as' => 'crud.pelayanan.restoreRevision',
'uses' => 'Admin\PelayananCrudController@restoreRevision',
]);
你说你不能访问你 public/admin/someitem
这是真的,因为你没有它的路线(实际上用 artisan route:list
在 cli 中检查路线)。但是 Backpack 开发人员做了一件事(实际上并不知道为什么)他们通过调用
在 destructor 方法中添加了额外的路由
`Route::resource($this->name, $this->controller, $options_with_default_route_names);`.
它应该确实有效,如果不是,请检查 index
(CrudController) 的行为。
还有一件事可能是您忘记了 php artisan vendor:publish --provider="Backpack\Base\BaseServiceProvider"
并且您没有查看文件,这就是您收到 500 错误的原因。
如果您有更多问题,请提出。
我按照 this 教程设置了一个 CRUD 示例。但我无法让它工作,我也不知道为什么。这是我的代码
SomeitemCrudController.php
<?php
namespace App\Http\Controllers\Admin;
use Backpack\CRUD\app\Http\Controllers\CrudController;
// VALIDATION: change the requests to match your own file names if you need form validation
use App\Http\Requests\SomeitemRequest as StoreRequest;
use App\Http\Requests\SomeitemRequest as UpdateRequest;
class SomeitemCrudController extends CrudController
{
public function setUp()
{
/*
|--------------------------------------------------------------------------
| BASIC CRUD INFORMATION
|--------------------------------------------------------------------------
*/
$this->crud->setModel("App\Models\Someitem");
$this->crud->setRoute("admin/someitem");
$this->crud->setEntityNameStrings('someitem', 'someitems');
/*
|--------------------------------------------------------------------------
| BASIC CRUD INFORMATION
|--------------------------------------------------------------------------
*/
$this->crud->setFromDb();
// $this->crud->setColumns(['nama']);
$this->crud->addField([
'nama' => 'Nama',
'keterangan' => 'Keterangan',
'harga' => 'Harga'
]);
}
public function store(StoreRequest $request)
{
$redirect_location = parent::storeCrud();
return $redirect_location;
}
public function update(UpdateRequest $request)
{
$redirect_location = parent::updateCrud();
return $redirect_location;
}
}
模特,Someitem.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Backpack\CRUD\CrudTrait;
class SomeItem extends Model
{
use CrudTrait;
//
protected $table = 'someitem';
protected $fillable = ['nama', 'keterangan', 'harga'];
public $timestamps = true;
}
请求,SomeitemRequest.php
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
class SomeitemRequest extends \Backpack\CRUD\app\Http\Requests\CrudRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return \Auth::check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// 'name' => 'required|min:5|max:255'
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
//
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
//
];
}
}
然后是路线
<?php
Route::group([
'prefix' => config('backpack.base.route_prefix', 'admin'),
'middleware' => ['admin'],
'namespace' => 'Admin'
], function() {
CRUD::resource('pelayanan', 'Admin\PelayananCrudController');
Route::get('/test', function () {
return view('welcome');
});
});
我可以成功访问http://localhost/myapp/public/admin/test
,但是我无法访问http://localhost/myapp/public/admin/someitem
,总是return错误500
我是 laravel(和 PHP)的新手,感谢您的帮助。谢谢!
我想让我的回答非常详细,所以我从头开始。我用的背包CRUD版本是^3.2.
看看这个文件
your-project/vendor/backpack/crud/src/CrudServiceProvider.php
是的,我知道 class 名字不是CRUD
,而是CrudServiceProvider
。那是因为他们在CrudServiceProvider
中有register
方法并且在其中他们做$loader->alias('CRUD', \Backpack\CRUD\CrudServiceProvider::class);
这使得CRUD
class 成为CrudServiceProvider
的别名。要了解有关其内部工作原理的更多信息,请阅读 Laravel Service Providers, Service Container and Facades.所以我们发现
CRUD::resource()
实际上是CrudServiceProvider::resource()
,所以进入这个方法,你会发现到目前为止只有一行return new CrudRouter($name, $controller, $options);
据我所知(如果我错了请纠正我)它叫做 Factory pattern/method. So go toCrudRouter
constructor (Github)。通读一遍。所以它所做的基本事情是代替这个CRUD::resource('pelayanan', 'Admin\PelayananCrudController');
它会放这样的东西
Route::post('pelayanan/search', [
'as' => 'crud.pelayanan.search',
'uses' => 'Admin\PelayananCrudController@search',
]);
Route::get('pelayanan/reorder', [
'as' => 'crud.pelayanan.reorder',
'uses' => 'Admin\PelayananCrudController@reorder',
]);
Route::post('pelayanan/reorder', [
'as' => 'crud.pelayanan.save.reorder',
'uses' => 'Admin\PelayananCrudController@saveReorder',
]);
Route::get('pelayanan/{id}/details', [
'as' => 'crud.pelayanan.showDetailsRow',
'uses' => 'Admin\PelayananCrudController@showDetailsRow',
]);
Route::get('pelayanan/{id}/translate/{lang}', [
'as' => 'crud.pelayanan.translateItem',
'uses' => 'Admin\PelayananCrudController@translateItem',
]);
Route::get('pelayanan/{id}/revisions', [
'as' => 'crud.pelayanan.listRevisions',
'uses' => 'Admin\PelayananCrudController@listRevisions',
]);
Route::post('pelayanan/{id}/revisions/{revisionId}/restore', [
'as' => 'crud.pelayanan.restoreRevision',
'uses' => 'Admin\PelayananCrudController@restoreRevision',
]);
你说你不能访问你 public/admin/someitem
这是真的,因为你没有它的路线(实际上用 artisan route:list
在 cli 中检查路线)。但是 Backpack 开发人员做了一件事(实际上并不知道为什么)他们通过调用
`Route::resource($this->name, $this->controller, $options_with_default_route_names);`.
它应该确实有效,如果不是,请检查 index
(CrudController) 的行为。
还有一件事可能是您忘记了 php artisan vendor:publish --provider="Backpack\Base\BaseServiceProvider"
并且您没有查看文件,这就是您收到 500 错误的原因。
如果您有更多问题,请提出。