Laravel 进阶任务笔记

在任务开始,我们会扩展一下新建的数据库表移植文件。刚建立的移植文件只有两列,手动添加如下:

public function up()
    {
        Schema::create(‘tasks‘, function (Blueprint $table) {
            $table->increments(‘id‘);
            $table->integer(‘user_id‘)->index();
            $table->string(‘name‘);
            $table->timestamps();
        });
    }

再次使用命令进行建表:

php artisan migrate

创建Model:

php artisan make:model Task

这一次我们会在新建的Model里添加一个属性:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [‘name‘];
}

通过fillable,我们声明name属性为mass-assignable。目前理解mass-assignable的意思是允许不同类型的赋值。

Models定义以后,我们现在需要对他们的关系进行声明。

在User中定义和Task的关系:

class User extends Authenticatable
{
    // Other Eloquent Properties...

    /**
     * Get all of the tasks for the user.
     */
    public function tasks()
    {
        return $this->hasMany(Task::class);
    }
}

在Task中定义和User的关系:

class Task extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [‘name‘];

    /**
     * Get the user that owns the task.
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

现在我们使用控制器来组织我们的Router。因为用户认证是常用的功能,因此laravel中已经集成了此功能。命令如下:

php artisan make:auth --views

之后在Router中添加如下行:

Route::auth();
protected $redirectTo = ‘/tasks‘;

这样就能自动注册用户授权,并将非法用户重定向至/tasks。

同时我们也需要将重定向在中间件app/Middleware/RedirectIfAuthenticated.php中定义:

return redirect(‘/tasks‘);

在进阶任务中,我们使用Controller进行业务逻辑的设计。在目录app/Http/Controllers下创建一个TaskController的artisan语法如下:

php artisan make:controller TaskController

创建好controller后,就可以在Router里根据url对应controller中的业务逻辑:

Route::get(‘/tasks‘, ‘[email protected]‘);
Route::post(‘/task‘, ‘[email protected]‘);
Route::delete(‘/task/{task}‘, ‘[email protected]‘);

使用Controller后我们就可以方便的用中间件对所有Controller里的业务进行用户权限管理,只需要在刚才创建的TaskController中加入:

class TaskController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(‘auth‘);
    }
}

定义视图的方法和基本任务中的一致,只是部分文件存储的路径不同,之后就可以在控制器中定义我们的业务逻辑:

public function index(Request $request)
{
    return view(‘tasks.index‘);
}

存储task的方法和基本任务中的一样,只不过现在需要在Controller中定义。

public function store(Request $request)
{
    $this->validate($request, [
        ‘name‘ => ‘required|max:255‘,
    ]);
  $request->user()->tasks()->create([
        ‘name‘ => $request->name,
    ]);

    return redirect(‘/tasks‘);
 }

可以发现储存时的验证和我们基本任务中router的有所区别。因为Controller类本身就支持validate,因此验证失败后errors变量会自动被压入session中,并且重定向至访问前的页面。

创建任务时,我们可以使用user和task的关系,通过此创建方法,可以自动设置task对应的userId。

这时候,我们的主页面还需要加入展示任务的功能,代码如下:

public function index(Request $request)
{
    $tasks = Task::where(‘user_id‘, $request->user()->id)->get();

    return view(‘tasks.index‘, [
        ‘tasks‘ => $tasks,
    ]);
}

这里用where查询获得任务,并将tasks传参给tasks.index

然而数据的逻辑我们还需要通过在Task Model中定义TaskRepository进行管理。因为Model就是针对特定表的操作集合。针对不同的业务逻辑,我们可能会有不同的对表的操作,因此为了方便重用,我们应该将所有的操作注册。

我们在app目录下新建Repositories目录,并创建TaskRepository类:

namespace App\Repositories;

use App\User;
use App\Task;

class TaskRepository
{
    /**
     * Get all of the tasks for a given user.
     *
     * @param  User  $user
     * @return Collection
     */
    public function forUser(User $user)
    {
        return Task::where(‘user_id‘, $user->id)
                    ->orderBy(‘created_at‘, ‘asc‘)
                    ->get();
    }
}

接下来我们需要将Repository引入我们的Controller:

namespace App\Http\Controllers;

use App\Task;
use App\Http\Requests;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Repositories\TaskRepository;

class TaskController extends Controller
{
    /**
     * The task repository instance.
     *
     * @var TaskRepository
     */
    protected $tasks;

    /**
     * Create a new controller instance.
     *
     * @param  TaskRepository  $tasks
     * @return void
     */
    public function __construct(TaskRepository $tasks)
    {
        $this->middleware(‘auth‘);

        $this->tasks = $tasks;
    }

    /**
     * Display a list of all of the user‘s task.
     *
     * @param  Request  $request
     * @return Response
     */
    public function index(Request $request)
    {
        return view(‘tasks.index‘, [
            ‘tasks‘ => $this->tasks->forUser($request->user()),
        ]);
    }
}

数据展示和删除的view视图和基本任务一致,不重复了。

接下来就是和基本任务中有所区别的地方,Router中我们使用Destroy方法:

Route::delete(‘/task/{task}‘, ‘[email protected]‘);

/**
 * Destroy the given task.
 *
 * @param  Request  $request
 * @param  Task  $task
 * @return Response
 */
public function destroy(Request $request, Task $task)
{
    //
}

上面是Router文件,下面是Controller文件中的对应方法。可以看到这里有个隐式传参,{task}会自动传递给$task变量。

由于此次我们引入了用户权限机制,我们担心在删除过程中用户随意传递task_id,因此我们需要建立Policy防止这一情况。Policy可以将授权逻辑进行整合处理。通常一个Policy对应一个Model。我们通过artisan创建app/Policies/TaskPolicy.php文件:

php artisan make:policy TaskPolicy

我们需要在TaskPolicy中声明某方法所需要的权限。如此处,Destroy方法需要确认用户的taskid和此taskid是否对应:

<?php

namespace App\Policies;

use App\User;
use App\Task;
use Illuminate\Auth\Access\HandlesAuthorization;

class TaskPolicy
{
    use HandlesAuthorization;

    /**
     * Determine if the given user can delete the given task.
     *
     * @param  User  $user
     * @param  Task  $task
     * @return bool
     */
    public function destroy(User $user, Task $task)
    {
        return $user->id === $task->user_id;
    }
}

之后我们需要将Task Model和TaskPolicy进行关联,在文件app/Providers/AuthServiceProvider.php的$policies变量中声明:

/**
 * The policy mappings for the application.
 *
 * @var array
 */
protected $policies = [
    ‘App\Task‘ => ‘App\Policies\TaskPolicy‘,
];

这样所有对Task的授权都会交予TaskPolicy。

现在重新回到我们的Controller:

public function destroy(Request $request, Task $task)
{
    $this->authorize(‘destroy‘, $task);
  $task->delete();

    return redirect(‘/tasks‘);
 }

当前用户会被自动传参,因此不需要额外传递。如果授权失败,将会跳转至403页面。

时间: 2024-10-21 11:42:00

Laravel 进阶任务笔记的相关文章

Jmeter进阶学习笔记(对性能、接口测试的进阶学习)

1.在进行测试的时候,可以采用fildler进行捕捉:如果需要在手机上操作的话,可在fildler option设置下,然后再手机的wifi中设置代理即可: 1.登录测试 登录的话,肯定是存在两个参数的,用户名与密码,且使用的方法应是Post; PS:登录此处还可以使用断言去判断是否登录正确: 2.获取列表系统(可以看下加载此列表需要多少时间),使用的get方法即可: 3.在列表中选择某一条记录进行发送信息操作(如果10万用户都同时发送信息,服务器是否正常工作): ...... 未完待续~ Jm

laravel框架——学习笔记

routes.php文件创建路由参数由{}包起来,不需要$ Route::get('/stu/{as}','[email protected]'); 在相对应的Controller创建funciton public function show($asd){//实现方法的参数需要$ //查询Stu这个model类可以用find带上参数 //不能忘记引入相对应的model use App\Stu; $res=Stu::all()->find($asd); return view('stu/stu',

php laravel框架学习笔记 (二) 数据库操作

原博客链接:http://www.cnblogs.com/bitch1319453/p/6810492.html mysql基本配置 你可用通过配置环境变量,使用cmd进入mysql,当然还有一种东西叫做mysql console 创建一个数据库   create database [数据库名]   [选项]; 展示已经创建的数据库 show datebases; 在登录后使用 use 语句指定数据库 use 数据库名; 展示表show tables;(需要先指定数据库) 展示表的内容desc

php laravel框架学习笔记 (一) 基本工作原理

原博客链接:http://www.cnblogs.com/bitch1319453/ 安装laraver完成后,在cmd中进入laravel目录,使用命令php artisan serve开启8000端口服务器 然后简单介绍一下laraver的工作流程.这个工作流程包含了页面编写以及传递参数,可以进行一些基本工作了 开始页面 与其他框架不同的是,框架中有一个route选项.打开app/http/request/route.php,你将看到 <?php /*|-------------------

Laravel Middleware 中间件笔记

Laravel的中间件可以方便的过滤进入我们网页的请求.包括用户授权,CORS来指定流出请求的header等. 定义一个新的中间件可以使用命令: php artisan make:middleware AgeMiddleware 这条命令在app/Http/Middleware中创建AgeMiddleware类. 我们假设我们过滤所有年龄小于200的请求: <?php namespace App\Http\Middleware; use Closure; class AgeMiddleware

Python进阶 学习笔记(一)

(笔记范围:第一章 课程介绍:第二章 函数式编程:第三章 模块) Python支持的函数式编程 不是纯函数式编程:允许有变量 支持高阶函数:函数也可以作为变量传入 支持闭包:有了闭包就能返回函数 有限度地支持匿名函数 变量可以指向函数名: >>> f=abs >>> f(-10) 10 高阶函数:能接受函数做参数的函数 变量可以指向函数 函数的参数可以接收变量 一个函数可以接收另一个函数作为参数 能接收函数做参数的函数就是高阶函数 DEMO:接收abs函数 定义一个函数

Laravel Homestead安装笔记

引言: 最近开始学习laravel框架,了解到有个laravel homestead的box,开发起来非常方便快捷,于是就准备开始配置homestead虚拟开发环境了 什么是Homestead 要想学会使用一款工具,那么必须要先学习这款工具到底能做什么,否则学习就是没有意义的,根据官方文档是行的解释: Laravel   Homestead 是一个官方的.预封装的Vagrant“箱子”,它提供给你一个奇妙的开发环境而不需要你在本机上安装PHP.HHVM.web服务器和其它的服务器软件.不用再担心

Laravel踩坑笔记——illuminate/html被抛弃

起因 在使用如下代码的时候发生报错 {!! Form::open() !!} 错误信息 [Symfony\Component\Debug\Exception\FatalErrorException] Call to undefined method Illuminate\Foundation\Application::bindShared() 原因 在Stack Overflow找到相关问题(Call to undefined method Illuminate\Foundation\Appli

Laravel框架学习笔记

教程里安装成功lavavel之后在地址栏输入 http://localhost/laravel5/public/home 如果访问失败进不去登陆页面,那可能是因为没有开启apache里的mod rewrite 模块 开启方法:把httpd.conf文件中 #LoadModule rewrite_module modules/mod_rewrite.so 前的#去掉,保存后重启apache就ok了 Laravel 中的路由,跟其他 PHP 框架一样,作用是把各种请求分流到各个控制器 Laravel