【问题标题】:Laravel Route Binding Model Undefined offset: 9Laravel 路由绑定模型未定义偏移量:9
【发布时间】:2018-06-12 19:47:07
【问题描述】:

我正在使用 laravel 5.2。我有一个名为 Book 的模型,然后尝试将路由绑定模型从我的控制器移动到 RouteServiceProvider.php

这是我将其移动到 RouteServiceProvider.php 之前的路由绑定模型

$book = Book::findOrFail($id);

之后(在我的 RouteServiceProvider.php 中)

$router->model('book', 'App\Book');

在我将它移动到 RouteServiceProvider 之前它可以正常工作,但现在它每次尝试更新时都会给我一个错误,(创建和存储工作正常)。

它未能更新数据库的输入,但是当我尝试在我的规则顶部使用dd($this->method()); 进行调试时,它显示“PATCH”

错误是Undefined offset: 9 ...framework\src\Illuminate\Validation\Validator.php line 1461: $extra[$segments[$i]] = $segments[$i + 1];

我假设错误来自我的更新控制器 return view('dashboards.book', compact('book')); 或 mybe 来自补丁/更新方法的条件请求

这是完整的代码

控制器@更新

public function update(Book $book, BookRequest $request)
{
    //$book = Book::findOrFail($id);  move to the RouteServiceProvider

    $input = $request->all();

    $book->update($request->all());

    //return view('dashboards.book');
    return view('dashboards.book', compact('book'));

}

BookRequest.php

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class BookRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {

        //$book = $this->route('book');

        //$this->route()->parameter('books');

        //dd($this->method());



        // Check Create or Update
        if ($this->method() == 'POST') {
            $label_rules = 'required|string|size:6|unique:books,label,';
            $isbn_rules = 'sometimes|string|size:10|unique:books,isbn,';
        }

        else {
            $label_rules = 'required|string|size:6|unique:books,label,' .$this->route()->parameter('book'); 
            $isbn_rules = 'sometimes|string|size:10|unique:books,isbn,' .$this->route()->parameter('book');
        }




        return [
            'judul'             => 'required|string|max:100',
            'label'             => $label_rules,
            'isbn'              => $isbn_rules,
            'tanggal_terbit'    => 'required|date',
            'status'            => 'required|in:tersedia,dipinjam,hilang,rusak',
            'id_penulis'        => 'required',
            'id_penerbit'       => 'required',
            'id_kategori'       => 'required',
        ];


    }
}

RouteServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Routing\Router;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to the controller routes in your routes file.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @param  \Illuminate\Routing\Router  $router
     * @return void
     */
    public function boot(Router $router)
    {
        //

        parent::boot($router);

        // route model binding
        $router->model('book', 'App\Book');
    }

    /**
     * Define the routes for the application.
     *
     * @param  \Illuminate\Routing\Router  $router
     * @return void
     */
    public function map(Router $router)
    {
        $router->group(['namespace' => $this->namespace], function ($router) {
            require app_path('Http/routes.php');
        });
    }
}

错误

in Validator.php line 1461
at HandleExceptions->handleError('8', 'Undefined offset: 9', 'E:\YUDY\WEB PROJECT\CLIENTS\perpus lab\testroutemodelbinding\vendor\laravel\framework\src\Illuminate\Validation\Validator.php', '1461', array('segments' => array('label:"099187"', 'isbn:"9918892810"', 'tanggal_terbit:"2018-02-10"', 'status:"tersedia"', 'id_penerbit:1', 'id_kategori:1', 'id_penulis:1', 'created_at:"2018-01-02 00:01:26"', 'updated_at:"2018-01-02 00:01:26"}'), 'extra' => array('label:"099187"' => 'isbn:"9918892810"', 'tanggal_terbit:"2018-02-10"' => 'status:"tersedia"', 'id_penerbit:1' => 'id_kategori:1', 'id_penulis:1' => 'created_at:"2018-01-02 00:01:26"'), 'count' => '9', 'i' => '8')) in Validator.php line 1461
at Validator->getExtraConditions(array('label:"099187"', 'isbn:"9918892810"', 'tanggal_terbit:"2018-02-10"', 'status:"tersedia"', 'id_penerbit:1', 'id_kategori:1', 'id_penulis:1', 'created_at:"2018-01-02 00:01:26"', 'updated_at:"2018-01-02 00:01:26"}')) in Validator.php line 1379
at Validator->getUniqueExtra(array('books', 'label', '{"id":15', 'judul:"Fast And Furious"', 'label:"099187"', 'isbn:"9918892810"', 'tanggal_terbit:"2018-02-10"', 'status:"tersedia"', 'id_penerbit:1', 'id_kategori:1', 'id_penulis:1', 'created_at:"2018-01-02 00:01:26"', 'updated_at:"2018-01-02 00:01:26"}')) in Validator.php line 1338
at Validator->validateUnique('label', '099187', array('books', 'label', '{"id":15', 'judul:"Fast And Furious"', 'label:"099187"', 'isbn:"9918892810"', 'tanggal_terbit:"2018-02-10"', 'status:"tersedia"', 'id_penerbit:1', 'id_kategori:1', 'id_penulis:1', 'created_at:"2018-01-02 00:01:26"', 'updated_at:"2018-01-02 00:01:26"}'), object(Validator)) in Validator.php line 485
at Validator->validate('label', 'Unique') in Validator.php line 425
at Validator->passes() in ValidatesWhenResolvedTrait.php line 24
at FormRequest->validate() in FoundationServiceProvider.php line 41
at FoundationServiceProvider->Illuminate\Foundation\Providers\{closure}(object(BookRequest), object(Application)) in Container.php line 1031
at Container->fireCallbackArray(object(BookRequest), array(object(Closure))) in Container.php line 994
at Container->fireResolvingCallbacks('App\Http\Requests\BookRequest', object(BookRequest)) in Container.php line 648
at Container->make('App\Http\Requests\BookRequest', array()) in Application.php line 697
at Application->make('App\Http\Requests\BookRequest') in RouteDependencyResolverTrait.php line 85
at ControllerDispatcher->transformDependency(object(ReflectionParameter), array('book' => object(Book)), array('book' => object(Book))) in RouteDependencyResolverTrait.php line 58
at ControllerDispatcher->resolveMethodDependencies(array('book' => object(Book)), object(ReflectionMethod)) in RouteDependencyResolverTrait.php line 41
at ControllerDispatcher->resolveClassMethodDependencies(array('book' => object(Book)), object(DashboardController), 'update') in ControllerDispatcher.php line 143
at ControllerDispatcher->call(object(DashboardController), object(Route), 'update') in ControllerDispatcher.php line 94
at ControllerDispatcher->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52
at Pipeline->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in ControllerDispatcher.php line 96
at ControllerDispatcher->callWithinStack(object(DashboardController), object(Route), object(Request), 'update') in ControllerDispatcher.php line 54
at ControllerDispatcher->dispatch(object(Route), object(Request), 'App\Http\Controllers\DashboardController', 'update') in Route.php line 174
at Route->runController(object(Request)) in Route.php line 140
at Route->run(object(Request)) in Router.php line 724
at Router->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in VerifyCsrfToken.php line 64
at VerifyCsrfToken->handle(object(Request), object(Closure))
at call_user_func_array(array(object(VerifyCsrfToken), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in ShareErrorsFromSession.php line 49
at ShareErrorsFromSession->handle(object(Request), object(Closure))
at call_user_func_array(array(object(ShareErrorsFromSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in StartSession.php line 64
at StartSession->handle(object(Request), object(Closure))
at call_user_func_array(array(object(StartSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 37
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure))
at call_user_func_array(array(object(AddQueuedCookiesToResponse), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in EncryptCookies.php line 59
at EncryptCookies->handle(object(Request), object(Closure))
at call_user_func_array(array(object(EncryptCookies), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Router.php line 726
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 699
at Router->dispatchToRoute(object(Request)) in Router.php line 675
at Router->dispatch(object(Request)) in Kernel.php line 246
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 44
at CheckForMaintenanceMode->handle(object(Request), object(Closure))
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Kernel.php line 132
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 99
at Kernel->handle(object(Request)) in index.php line 53
at require_once('E:\YUDY\WEB PROJECT\CLIENTS\perpus lab\testroutemodelbinding\public\index.php') in server.php line 21

对错误有什么建议吗?

【问题讨论】:

  • 您能否向我们提供问题的完整堆栈跟踪?
  • @sisve 您好,感谢您的回复,请查看我的问题更新
  • 为什么您的 $label_rules 和 $isbn_rules 在帖子中以逗号结尾? $this-&gt;route()-&gt;parameter('book') 可能会返回带有模型绑定的 Book 实例,而不是特定的 id。
  • 我不确定,也许我在将控制器移动到 BookRequest 之前从控制器复制了规则。参考 laravel 文档 Forcing A Unique Rule To Ignore A Given ID: "'email' => 'unique:users,email_address,'.$user->id"。顺便说一句,我试图删除昏迷,但我把我扔到另一个错误SQLSTATE[HY093]: Invalid parameter number..

标签: laravel laravel-5.2


【解决方案1】:

您的验证规则之前假定路线段是一个标识符。随着模型绑定现在处于活动状态,它会返回一个模型实例。

$label_rules = 'required|string|size:6|unique:books,label,' . 
                    $this->route()->parameter('book'); 

这可以在您的堆栈跟踪中看到。

in Validator.php line 1461
at HandleExceptions->handleError('8', 'Undefined offset: 9', 'E:\YUDY\WEB PROJECT\CLIENTS\perpuslab\testroutemodelbinding\vendor\laravel\framework\src\Illuminate\Validation\Validator.php', '1461', array('segments' => array('label:"099187"', 'isbn:"9918892810"', 'tanggal_terbit:"2018-02-10"', 'status:"tersedia"', 'id_penerbit:1', 'id_kategori:1', 'id_penulis:1', 'created_at:"2018-01-02 00:01:26"', 'updated_at:"2018-01-02 00:01:26"}'), 'extra' => array('label:"099187"' => 'isbn:"9918892810"', 'tanggal_terbit:"2018-02-10"' => 'status:"tersedia"', 'id_penerbit:1' => 'id_kategori:1', 'id_penulis:1' => 'created_at:"2018-01-02 00:01:26"'), 'count' => '9', 'i' => '8')) in Validator.php line 1461
at Validator->getExtraConditions(array('label:"099187"', 'isbn:"9918892810"', 'tanggal_terbit:"2018-02-10"', 'status:"tersedia"', 'id_penerbit:1', 'id_kategori:1', 'id_penulis:1', 'created_at:"2018-01-02 00:01:26"', 'updated_at:"2018-01-02 00:01:26"}')) in Validator.php line 1379
at Validator->getUniqueExtra(array('books', 'label', '{"id":15', 'judul:"Fast And Furious"', 'label:"099187"', 'isbn:"9918892810"', 'tanggal_terbit:"2018-02-10"', 'status:"tersedia"', 'id_penerbit:1', 'id_kategori:1', 'id_penulis:1', 'created_at:"2018-01-02 00:01:26"', 'updated_at:"2018-01-02 00:01:26"}')) in Validator.php line 1338
at Validator->validateUnique('label', '099187', array('books', 'label', '{"id":15', 'judul:"Fast And Furious"', 'label:"099187"', 'isbn:"9918892810"', 'tanggal_terbit:"2018-02-10"', 'status:"tersedia"', 'id_penerbit:1', 'id_kategori:1', 'id_penulis:1', 'created_at:"2018-01-02 00:01:26"', 'updated_at:"2018-01-02 00:01:26"}'), object(Validator)) in Validator.php line 485
at Validator->validate('label', 'Unique') in Validator.php line 425

唯一验证规则支持多个参数,而您尝试作为 id 传入的实际上是 {"id":15'(第一个逗号之前的数组的初始部分),然后是主键列 'judul:"Fast And Furious"',然后是尝试将其余条目解析为额外条件。它们应该成对出现(column,value,column,value,...),但在您的情况下,数组中只剩下 7 个条目,一个奇数。因此失败。

【讨论】:

  • 你的意思是我必须删除逗号?
  • 不,我是说$this-&gt;route()-&gt;parameter('book') 返回一个 Book 实例,而不是您期望的标识符。如果需要,您必须从 Book 实例中读取 id。
猜你喜欢
  • 2014-06-26
  • 1970-01-01
  • 2021-05-24
  • 2016-06-04
  • 2021-07-12
  • 2015-12-20
  • 2014-06-25
  • 2017-06-22
  • 2020-01-02
相关资源
最近更新 更多