laravel笔记5 无线分类3 静态方法问题 验证功能 自定义验证规则
静态方法里面访问对象直接使用类名加::调用
使用self关键字加::访问当前静态成员
静态方法中不能使用$this 访问类方法和属性
在静态方法中获取非静态类的方法或者属性需要先实例一下,然后在进行调用
例子1:
public static function getshop(){
//此处需要先实例一下
$data = new self();
$sum = $data->getSum(5,6);
return 'this is static function';
}
private function getSum($a,$b){
return $a+$b;
}
例子2:
//获取分类列表
public static function getcates(){
$cates = self::OrderBy('sort','Desc')->OrderBy('id','Desc')->get();
//$cates可以获取传入所有参数
$cates = self::makecates($cates);
//如果要在静态方法中获取非静态方法,那么需要先实例一下
//$cates = (new self())->makecates($cates);
return$cates;
}
//重新组织数据
//此处如果没有static 而上面的函数要调用的话 需要先实例一下
private static function makecates($data,$pid=0,$level=0){
$arr = [];
foreach ($data as $item){~~~~~~~~~~~~~~~
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
添加表单验证
自定义验证规则1:验证里面的字段
命令 php artisan make:request CheckCategory 在app目录request里面建立CheckCategory文件
在控制器相应方法里面注入表单验证函数方法
//function create里面原来的Request替换成验证函数方法CheckCategory
public function create(CheckCategory $request){
if($request->isMethod('post')){
// dd($request->post());
$category = new Category();
错误提示:进行分类编辑提交时提示检测到该服务器正在将指向此网址的请求无限循环重定向。
这是因为进行edit的时候无论是获取get路由视图还是post提交数据,都会走表单验证,但是get路由的时候是没有验证里面需要的字段的,
它是不用进行验证的,因此导致通不过验证,从而无限次重定向
解决方法:找官方文档,里面按条件增加规则,存在时才验证。只有获取的数据中有需要验证的字段时候才进行验证 sometimes
public function rules()
{
return [
//使用sometimes 存在需要验证的字段时才验证
'name'=>'sometimes|required',
];
}
}
自定义验证规则2:验证pid字段 防止无限递归(如编辑城市时候,临沂的上级分类字段pid是兰山区,这样就会陷入无限循环)
命令php artisan make:rule CheckCategoryPid 会在app目录下建立rules文件夹 CheckCategoryPid文件
public function passes($attribute, $value)
{
if($value !=0){
return false;
}
return true;
}
回到CheckCategory文件引入CheckCategoryPid方法
如果不引入会有如下错误提示Class 'App\Http\Requests\CheckCategoryPid' not found
解决方法:在CheckCategory文件头部
use App\Rules\CheckCategoryPid;
这里是如何引入CheckCategoryPid方法
public function rules()
{
//sometimes 如果有这个字段值时才验证
return [
// new CheckCategoryPid是官方文档自定义规则里面的写法
'pid'=>['sometimes','required',new CheckCategoryPid],
'name'=>'sometimes|required',
];
}
}
以上仅仅是演示如果自定义规则及引入,下面是具体的验证函数方法
首先在CheckCategoryPid文件中,需要先定义分类的pid
class CheckCategoryPid implements Rule
{
private $id; //private一个$id属性
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct($id)
{
$this->id = $id; //通过构造行数获取$id
//
}
然后把这个id传参到验证文件CheckCategory.php中的new CheckCategoryPid($this->id)函数参数里
public function rules()
{
//sometimes 如果有这个字段值时才验证
return [
// new CheckCategoryPid是官方文档自定义规则里面的写法
'pid'=>['sometimes','required',new CheckCategoryPid($this->id)],
'name'=>'sometimes|required'
];
}
}
接着需要把这个参数值$id传到模型文件CheckCategory.php里面进行数据查询
//获取指定分类的所有子分类
public static function getChildsIds($id){
//定义一个数组,包含自身
$ids[] = $id;
//获取所有重组数据 赋值到$data
$data = self::all();
// 获取重组的数据 $data是原始数据 $id是上面的$pid
$childs = self::makecates($data,$id);
foreach ($childs as $item){
$ids[] = $item->id;
}
return $ids;
}
}
在CheckCategoryPid.php文件中调用getChildsIds方法进行验证
//这里的$value是上级的分类pid
public function passes($attribute, $value)
{
//打印当前要编辑分类的id
//dd($this->id);
//从模型获取指定分类里面的所有子分类以及自身
$ids = Category::getChildsIds($this->id);
if(in_array($value,$ids)){
return false;
}
return true;
}
//这里edit参数里注入CheckCategory
public function edit(CheckCategory $request,Category $category){
if($request->isMethod('POST')){
$category->name = $request->name;
$category->sort = $request->sort;
$category->pid = $request->pid;
》》》》》》》》》》》》》》》》》》
然后在
CheckCategory