控制器

控制器

  • 简单的说,控制器本质上是在一个位置将一个或多个路由有逻辑组织在一块的类。控制器往往会将类似的路由组合在一起,特别是如果应用程序是按照传统CRUD格式构造的,在这种情况下,控制器可以处理那些可对特定资源执行的所有操作

  • 控制器的主要任务是捕获HTTP请求,并将这些请求传递给应用程序的剩余部分

  • 生成控制器

    php artisan make:controller cname
    

    接下来就会在app/Http/Controllers中创建一个名为cname.php的新文件

  • 控制器的命名空间

    为控制器创建一个路由

    Route::get('/', 'cname@fun');
    

    在上面这个路由中我引用了一个具有完全限定类名的控制器APP\Http\Controllers\cname但是只使用了类名cname,这是因为,在默认情况下,Laravel被设置为在该命名空间中寻找控制器

  • 通用控制器方法示例

    • 返回视图

      public function index() {
        return view('fun')->with('variable', Task::all());
      }
      

      该控制器方法会加载resouces/views/fun.php视图,并将其通过一个名为variable的变量进行传递,其中包含Task::all()Eloquent方法的结果

    • 获取用户输入

      此方法的作用是从用户哪里获取输入内容并对其进行操作

      • 首先,快速实现绑定

        //绑定基本的表单操作
        //route/web.php
        Route::get('tasks/create', 'Taskscontroller@create');
        Route::post('tasks', 'Taskscontroller@store');
        

        绑定tasks/create的GET操作(显示表单)和tasks/的POST操作(创建一个新的任务并进行POST操作时提交到tasks/)。假设控制器中的create()方法只显示一个表单,store()方法的使用如下所示

        //常见的表单输入控制器方法
        //Taskscontroller.php
        public function store() {
            $task = new Task;
            $task->title = Input::get('discription');
            $task->save();
            
            return redirect('tasks');
        }
        

        该示例使用了Eloquent模型和redirect()函数,创建了一个新的Task,从用户输入中提取数据并进行保存,然后重定向到显示所有任务(task)的页面。

        从POST中获取用户输入有两种主要方式:这里使用了Input facade及请求对象(request object)

    • 将依赖注入控制器

      Laravel的facade代表Laravel代码库中最有用的类的简单界面,可以获取当前相关请求,用户输入,会话和缓存等信息,所有的控制器方法都是由Laravel的容器进行解析的,这意味着所有的指定容器都知道如何解析的信息都将被自动注入

      如果希望拥有一个Request对象的实例而不是用facade实现,只需要在方法参数中指定Illuminate\Http\Request就行,如下示例

      public function store(\Illuminate\Http\Request $request) {
          $task = new Task;
          $task->title = $request->input('title');
          $task->description = $request->input('description');
          $task->save();
          
          return redirect('tasks');
      }
      
  • 资源控制器

    • Laravel对传统REST/CRUD控制器的所有路由都有一些约定

      HTTP动词 URL 控制器方法名称 具体名字 描述
      GET tasks index() tasks.index 显示所有任务
      GET tasks/create create() tasks.create 显示创建任务表单
      POST tasks store() tasks.store 从创建任务表单中接受表单提交
      GET tasks/{task} show() tasks.show 显示一个任务
      GET tasks/{task}/edit edit() tasks.edit 编辑一个任务
      PUT/PATCH tasks/{task} update() Tasks.update 从编辑任务表单中接受表单提交
      DELETE tasks/{task} destroy() tasks.destroy 删除一个任务
    • 绑定资源控制器

      • 以上是在Laravel中使用的传统路由名称,但我们不必为每一个控制器方法生成路由,而可以使用一种叫“资源控制器绑定”的方法

        //routes/web.php
        Route::resource('tasks', 'TasksController');
        

        这样就可以自动将该资源上的所有路由绑定到指定控制器的相应方法上,他也会适当地命名这些路由,例如,tasks资源控制器上的index()方法将被命名为tasks.index

你可能感兴趣的:(控制器)