作为程序员一定要保持良好的睡眠,才能好编程

第三课 laravel创建控制器 RestFul 路由解释

发布时间:2020-03-23

一、:laravel如何创建一个控制器?

控制器的创建方法有两种:

      1、新建一个文件,写入php代码并继承Controller类,即可

    IndexController.php

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;

 class IndexController extends Controller{
     //方法
     public function index(){
         echo "IndexController-index方法";
     }

 }
?>

    routes.php如何配置?

 

    配置路由:app/Http/routes.php

Route::get("index","IndexController@index");

    t1.png


访问url地址:www.app.com/index

  

     结果:IndexController-index方法

      t2.png


      2、使用artisan 的方法去创建


      &nb




二、:控制器应该放在什么位置?

app/Http/Controllers 放在这个目录中。

结合项目的实施,需要有  后台和前台,那又应该怎么去做呢?

直接在Controllers这个目录下,创建Admin和Home这两个文件夹,把对应的控制器放在这个目录,

然后把控制器的命名空间改成这个目录,保存即可。


分目录创创建控制器:



t3.png

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;

class UserController extends Controller{

    public function index(){
        echo "user--index";
    } 
}




t4.png

<?php

Route::get("user","Admin\UserController@index");

?>



t5.png


拔高:


t6.png


<?php

Route::get('b', ['uses' => 'IndexController@b', 'as' => 'bb']);

route("bb"); 可以得到访问这个控制器的url地址   http://www.app.com/b

t7.png


那么说了,能不能写在一行中呢?

Route::get("index","Admin\IndexController\index")->name("name");




路由分组:


路由分组使用的场景是  比如后台登录,后台所有的都是 admin   看图:

t8.png



不但前缀可以分组,命名空间也可以也可以单独提取出来:如图

t9.png




t10.png


使用命令创建一个控制器:

php artisan make:controller UserController

个人不喜欢,我喜欢复制粘贴



php artisan route:list 列出所有的路由


t11.png





资源路由


Route::resource("article","ArticleController");


这一条路由有什么作用?

看 使用 php artisan route:list 来看看


t12.png


image.png


php artisan make:controller ArticleController --resource


Route::resource('article', 'ArticleController');

<?php

namespace App\Http\Controllers\Inquiry;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

为什么用resource参数,因为我们在做一个后台的时候,设计到增删改查操作,而这些操作我们通过–resource就可以直接生成这些方法

,Route::resource其实就是生成了快捷的路由,让我们本来需要写的get,post,delete,patch直接用restful方式一键生成了。


**需要注意的是index是列表, store是新增,show是详情,update是更新, destory是删除。




通过resource 这条路由,就省去了一条一条去写路由规则。


那么我如果在ArticleController中定义了一个方法,resource这个路由是不能去匹配到这个方法的,

需要单独定义,才能访问

Route::get("article/test","ArticleController@test");
Route::
resource("article","ArticleController");

单独定义的路由,需要放在resource它的上面,否则报错

Route::get("aa/test","ArticleController@test");

如果使用这种模式的话就正常访问,但如果改成这种模式就报错了,一定要切记

Route::resource("article","ArticleController");
Route::get("article/test","ArticleController@test");

自定义的路由,要使用article/这样的方式,必须放在resource  路由的上面。


通过测试,每一个路由都是可以访问的。




image.png


模型绑定器在哪里: RouteServiceProviders.php  在这个文件中有一个 boot 方法,可以在方法内绑定相关的规则


例如: Route::pattern('id','[0-9]+');


image.png

在boot方法里写的验证规则,则全局有效。 只验证0-9 之间的数字


如果全局绑定后,是否可以局部解除呢?


答案是可以的,

Route::get("aa/test/{id}","ArticleController@test")->where('id','*');

这样就可以解除对id的限制,输入的任何字符都是可以的。


image.png





路由正常跳转是302 临时跳转,那么如何可以永久跳转呢? 使用301 

image.png


image.png


image.png




视图路由:



image.png

Route::view("task","task",['id'=>10]);


image.png


通过匿名函数的形式,填写view视图


或在控制器中 view函数返回视图



响应输出,response


image.png



路由重定向:

image.png


//跳转资源外部

redirect()->away("http://www.baidu.com");





资源路由:


image.png


php artisan route:list 打印出当前项目中所有的路由


image.png






路由别名、路由限速器:

https://www.heibaiketang.com/course/show/165.html