【问题标题】:Laravel 5.2 Call to undefined method Illuminate\Database\Query\Builder::activateTask()Laravel 5.2 调用未定义的方法 Illuminate\Database\Query\Builder::activateTask()
【发布时间】:2016-02-29 02:19:10
【问题描述】:

我是一个使用 laravel 的新手,在将代码从路由更改为控制器后遇到了问题。

当我将它们放在 routes.php 中时,所有代码都运行良好,但是当我将此代码放入控制器 Task.php 中的函数并将函数函数添加到 routes.php 时,我收到以下错误 ->

BadMethodCallException in Builder.php line 2161: Call to undefined method Illuminate\Database\Query\Builder::activateTask()



in Builder.php line 2161
at Builder->__call('activateTask', array(object(Task)))
at call_user_func_array(array(object(Builder), 'activateTask'), array(object(Task))) in Builder.php line 1313
at Builder->__call('activateTask', array(object(Task)))
at call_user_func_array(array(object(Builder), 'activateTask'), array(object(Task))) in Model.php line 3490
at Model->__call('activateTask', array(object(Task)))
at call_user_func_array(array(object(Task), 'activateTask'), array(object(Task))) in Model.php line 3504
at Model::__callStatic('activateTask', array(object(Task))) in routes.php line 45
at RouteServiceProvider->{closure}(object(Task))
at call_user_func_array(object(Closure), array('task' => object(Task))) in Route.php line 158
at Route->runCallable(object(Request)) in Route.php line 137
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 124
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 124
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 62
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 124
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 124
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 124
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 124
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('D:\wamp64\organizer\public\index.php') in server.php line 21

我的任务控制器Task.php ->

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class Task extends Controller
{
    //

    public function activateTask($task)
    {
        if($task->active == 1)
        {
            return redirect('/');
        }
        else
        {
            $task->active = 1;
            $task->save();
            if(Session('active') != null)
            {
                $oldtask = App\Session::find(Session('active'));
                $oldtask->Task->active = 0;
                $oldtask->Task->save();
                $oldtask->touch();
                $oldtask->save();
            }
            $session = new Session;
            $session->task()->associate($task);
            $session->save();
            Session(['active' => $session->id]);
            return redirect('/');
        }
    }

    public function saveTask($request) {

        $validator = Validator::make($request->all(), [
            'name' => 'required|max:255',
        ]);

        if($validator->fails()) {
            return redirect('/')->withInput()->withErrors($validator);
        }

        $task = new Task;
        $task->name = $request->name;
        $task->deadline = $request->deadline;
        $task->save();
    }

}

任务模型Task.php ->

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    //
    public function sessions()
    {
        return $this->hasMany('App\Session');
    }
}

会话模型Session.php ->

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Session extends Model
{
    //

    public function task()
    {
        return $this->belongsTo('App\Task');
    }

}

routes.php ->

<?php

use App\Task;
use App\Session;

use Illuminate\Http\Request;

Route::group(['middleware' => ['web']], function () {
    //

    Route::get('/', function() {
        $task = Task::orderBy('created_at', 'desc')->get();

        return view('layouts/tasks', [
            'tasks' => $task
        ]);

    });


    Route::post('/task', function (Request $request) {
        Task::saveTask($request);
    /*   
        $validator = Validator::make($request->all(), [
            'name' => 'required|max:255',
        ]);

        if($validator->fails()) {
            return redirect('/')->withInput()->withErrors($validator);
        }

        $task = new Task;
        $task->name = $request->name;
        $task->deadline = $request->deadline;
        $task->save();


    */
        return redirect('/');
    });



    Route::post('/task/{task}/activate', function (Task $task) {
        Task::activateTask($task);
    });



    Route::post('/task/{task}/deactivate', function (Task $task) {
        $task->active = 0;
        $task->save();
        $session = App\Session::find(Session('active'));
        $session->touch();

        $started = strtotime($session->created_at);
        $ended = strtotime($session->updated_at);
        $hours = abs(($ended - $started))/(60*60);
        $session->hours = $hours;

        $session->save();
        Session(['active' => null]);
        return redirect('/');

    });

    Route::delete('/task/{task}', function (Task $task){
        if($session = Session::find(Session('active')))
        {
            if($session->task->id == $task->id)
            {
                Session(['active', null]);
            }
        }

        $task->delete();
        return redirect('/');
    });

});

当我按下按钮发布到路线时发生问题。

试图用谷歌搜索这个问题并尝试了不同的方法来解决这个问题,但完全没有运气。我很确定这是一件非常简单和愚蠢但无法弄清楚的事情。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    您的路线设置不正确。要使用控制器,您需要以controller@method 格式传递一个字符串作为第二个参数。所以,你的路线应该是这样的:

    Route::post('/task/{task}/activate', 'Task@activateTask');
    

    此外,您的控制器方法期望传入的值是模型,而不是 id,因此您需要键入提示您的参数以利用隐式模型绑定:

    public function activateTask(\App\Task $task) {
        //
    }
    

    您可能需要查看routing documentation 以了解更多信息。

    【讨论】:

    • 非常感谢!我试图从文档中找出答案。我只是不明白变量是如何通过路由传递的。但是如果您在函数中请求它,它似乎会自动执行?在将应用程序/会话添加到任务控制器后开始工作。还有一些问题,但希望我能自己解决。
    猜你喜欢
    • 2017-02-20
    • 2018-10-03
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2014-04-25
    • 2017-10-04
    • 2018-05-17
    相关资源
    最近更新 更多