首页 文章

Laravel Backpack CRUD无法正常工作

提问于
浏览
0

我按照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 ,它总是返回错误500

我是laravel(和PHP)的新手,感谢任何帮助 . 谢谢!

1 回答

  • 1

    我想让我的答案非常详细,所以这就是我从一开始就开始的原因 . 我使用的CRUD背包的版本是^ 3.2 .

    • 看看这个文件 your-project/vendor/backpack/crud/src/CrudServiceProvider.php 是的我知道类名不是 CRUD 而是 CrudServiceProvider . 那是因为他们在 CrudServiceProvider 中有 register 方法,并且在其中它们执行 $loader->alias('CRUD', \Backpack\CRUD\CrudServiceProvider::class); ,这使 CRUD 类别为 CrudServiceProvider . 通过阅读Laravel Service ProvidersService ContainerFacades了解更多内容 .

    • 所以我们已经发现 CRUD::resource() 实际上意味着 CrudServiceProvider::resource() ,所以得到这个方法,据我所知你会发现只有一行 return new CrudRouter($name, $controller, $options); (如果我'm wrong correct me) it'被称为Factory pattern/method . 那么去 CrudRouter 构造函数(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 并且's true, because you don' t有路由(实际上用 artisan route:list 检查cli中的路由) . 但是背包开发者做了一件事(实际上并不知道为什么)他们通过调用在destructor方法中添加了额外的路由

    `Route::resource($this->name, $this->controller, $options_with_default_route_names);`.
    

    并且它应该实际工作,如果不是,检查 index (CrudController)的行为 .

    还有一件事你可能忘了 php artisan vendor:publish --provider="Backpack\Base\BaseServiceProvider" 而且你不知道为什么你会得到500错误 .

    如果您有更多问题,请询问 .

相关问题