Commit 9976b708 by 庄欣

攻略部分的API

parent cac306fa
<?php
namespace App\Article\Events;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Event;
use App\Article\Model\Art as ArtModel;
class ArtAddEvent extends Event
{
use SerializesModels;
public $model;
public function __construct(ArtModel $model)
{
$this->model = $model;
}
}
<?php
namespace App\Works\Events;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Event;
use App\Article\W as WorksModel;
class ArtEditedEvent extends Event
{
use SerializesModels;
public $model;
public function __construct(ArtModel $model)
{
$this->model = $model;
}
}
<?php
/**
* Created by PhpStorm.
* User: zhuangxin
* Date: 16-9-13
* Time: 下午5:01
*/
namespace App\Article\Listeners;
use App\Article\Events\ArtAddEvent;
use App\Article\Events\ArtEditedEvent;
use App\Member\Model\User as UserModel;
use App\Headline\Model\HeadLine;
use App\Libraries\ElasticSearch\Search;
use App\Article\Model\Art as ArtModel;
class ArtListener
{
public function handle($event)
{
$model = $event->model;
try {
if ($event instanceof ArtAddEvent) {
$role = UserModel::getUserRole($model->uid);
if ($role !== false) {
if ($role == UserModel::ROLE_PHOTOGRAPHER) {
HeadLine::add(HeadLine::PHOTOGRAPHER_ARTICLE_PUBLISH, [
'photographer' => UserModel::getUserInfo($model->uid,["nickname"])->nickname,
'article' => $model->title,
'target' => $model->id
]);
}
if ($role == UserModel::ROLE_MASTER) {
HeadLine::add(HeadLine::MASTER_ARTICLE_PUBLISH, [
'master' => UserModel::getUserInfo($model->uid,["nickname"])->nickname,
'article' => $model->title,
'target' => $model->id
]);
}
}
}
$searcher = Search::getSearcher();
if ($model->is_del == 1 || $model->is_hidden == 1 || $model->exists == false) {
$searcher->del(Search::ART , $model->id);
} elseif ($model->is_del == 0 && $model->is_hidden == 0) {
$searcher->save(Search::ART , $model->id , [
"article_id" => $model->id,
"title" => $model->title,
"kw" => implode(" ",array_column($model->relation_keywords()->get("kw")->toArray(),"kw")),
"nickname" => UserModel::getUserInfo($model->uid, "nickname")['nickname'],
"lasttime" => date("Y-m-d H:i:s")
]);
}
} catch (\Exception $e) {
return;
}
}
}
\ No newline at end of file
......@@ -8,14 +8,79 @@
namespace App\Article\Model;
use App\Traits\Models;
use Illuminate\Database\Eloquent\Model;
use App\Article\Model\Keywords;
use App\Kw\Model\Keywords as BaseKeyWords;
class Art extends Model
{
use Models;
const ARTICLE = 0;
const ACTIVE = 1;
static $NAME = [
self::ARTICLE => "攻略",
self::ACTIVE => "动态"
];
protected $table = "myp_article";
public function relation_keywords()
{
return $this->hasMany(Keywords::class,"works_id")->where('is_del',0);
return $this->hasMany(Keywords::class,"article_id")->select(Keywords::fields);
}
public static function newArt($data)
{
$model = new self;
DB::beginTransaction();
try {
$model->fill($data);
if (isset($data['keywords']) && !empty($data['keywords'])) {
$keywords_list = [];
foreach ($data['keywords'] as $keyword) {
$keywords = new Keywords();
$words = BaseKeyWords::getIdByWords($keyword,$data['uid'],true);
$keywords->kw = $words->kw_name;
$keywords->kw_id = $words->id;
array_push($keywords_list,$keywords);
}
$model->relation_keywords()->saveMany($keywords_list);
}
$model->save();
} catch (\Exception $e) {
DB::rollBack();
return false;
}
DB::commit();
return $model;
}
public function uptArt($data)
{
DB::beginTransaction();
try {
$this->fill($data);
if (isset($data['keywords']) && !empty($data['keywords'])) {
$keywords_list = [];
foreach ($data['keywords'] as $keyword) {
$keywords = new Keywords();
$words = BaseKeyWords::getIdByWords($keyword,$data['uid'],true);
$keywords->kw = $words->kw_name;
$keywords->kw_id = $words->id;
array_push($keywords_list,$keywords);
}
$this->relation_keywords()->delete();
$this->relation_keywords()->saveMany($keywords_list);
}
$this->save();
} catch (\Exception $e) {
DB::rollBack();
return false;
}
DB::commit();
return true;
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: zhuangxin
* Date: 16-9-14
* Time: 下午5:56
*/
\ No newline at end of file
namespace App\Article\Model;
use \Illuminate\Database\Eloquent\Model;
class Keywords extends Model
{
protected $table = "myp_article_kw";
const fields = [
"id","kw_id","kw"
];
}
\ No newline at end of file
<?php
namespace App\Article\Validation;
use App\Http\Validation\ValidatorBase as Validator;
class ArtValidator extends Validator
{
protected $validator = [
'title' => 'required|chinese_lenth:2,50',
'cover' => 'required',
'content' => 'required'
];
protected $message = [
'title.required' => '需要输入标题',
'title.chinese_lenth' => '标题限制为2到50个字符',
'cover.required' => '请添加封面',
'content.required' => '请输入内容',
];
/**
* 额外规则
* @param array $data
*/
public function custom_validate(array $data)
{
$messages = [];
if (!empty($data['keywords'])) {
foreach($data['keywords'] as $keyword) {
if(mb_strlen($keyword,"utf8") > 4) {
$messages[] = "关键词: \"".$keyword."\" 应小于4个字";
break;
}
}
}
self::$result->setCustomMessages($messages);
return isEmpty($messages);
}
}
\ No newline at end of file
......@@ -8,9 +8,14 @@
namespace App\Article\v1\Controller;
use App\Article\Events\ArtAddEvent;
use App\Article\Validation\ArtValidator;
use App\Traits\Controller;
use App\Works\Events\ArtEditedEvent;
use Illuminate\Support\Facades\Event;
use Symfony\Component\HttpFoundation\Request;
use App\Article\Model\Art as ArtModel;
use App\Http\Response\Response;
class Article extends \Illuminate\Routing\Controller
{
......@@ -21,7 +26,7 @@ class Article extends \Illuminate\Routing\Controller
"uid","title","is_del","type"
];
public function lists()
public function index()
{
$query = request()->query();
$where = $this->filter($query);
......@@ -33,7 +38,45 @@ class Article extends \Illuminate\Routing\Controller
public function store(Request $request)
{
$validator = new ArtValidator();
$post = $request->all();
$res = $validator->validate($post);
if ($res->fails()) {
$messages = $validator->getMessages();
return Response::error($messages,HttpStatus::HttpValidationFailed);
}
$this->csrf($post,'content');
$model = ArtModel::newArt($post);
if ($model !== false) {
Event::fire(new ArtAddEvent($model));
return Response::ok();
} else {
return Response::error();
}
}
public function update($id,Request $request)
{
try {
$model = ArtModel::findOrFail($id, ["id"]);
$post = $request->all();
$validator = new ArtValidator();
$res = $validator->validate($post);
if ($res->fails()) {
$messages = $validator->getMessages();
return Response::error($messages,HttpStatus::HttpValidationFailed);
}
$post['content'] = $this->csrf($post,'content');
$model->uptArt($post);
if ($model !== false) {
Event::fire(new ArtEditedEvent($model));
return Response::ok();
} else {
return Response::error();
}
} catch (ModelNotFoundException $e){
return Response::error(HttpStatus::HttpNotFound,"攻略未找到");
}
}
public function show($id)
......@@ -47,15 +90,10 @@ class Article extends \Illuminate\Routing\Controller
}
}
public function keywords($id,Request $request)
{
}
public function getRelate($id,$relation)
{
try {
$model = WorksModel::findOrFail($id , ["id"]);
$model = ArtModel::findOrFail($id , ["id"]);
$model->getRelate($relation);
return Response::success($model);
} catch (ModelNotFoundException $e){
......
......@@ -9,7 +9,7 @@ class Category extends \Illuminate\Routing\Controller
{
public function lists()
public function index()
{
}
......
<?php
namespace App\Headline\Model;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
class HeadLine extends Model
{
const IDENT_PASS = 1;
const SETS_PUBLISH = 2;
const PHOTOGRAPHER_ARTICLE_PUBLISH = 3;
const OPEN_NEW_CITY = 4;
const MASTER_ARTICLE_PUBLISH = 5;
const SETS_RECOMMEND = 6;
const TITLE = [
self::IDENT_PASS => "摄影师通过认证",
self::SETS_PUBLISH => "发布套系",
self::PHOTOGRAPHER_ARTICLE_PUBLISH => "摄影师发布攻略",
self::OPEN_NEW_CITY => "开通新城市",
self::MASTER_ARTICLE_PUBLISH => "达人发布攻略",
self::SETS_RECOMMEND => "推荐套系"
];
const TEMPLATE = [
self::IDENT_PASS => "摄影师「{photographer}」入驻约拍啦",
self::SETS_PUBLISH => "摄影师「{photographer}」添加了新套系「{sets}」",
self::PHOTOGRAPHER_ARTICLE_PUBLISH => "摄影师「{photographer}」发布了新攻略「{article}」",
self::OPEN_NEW_CITY => "约拍开通了新服务城市「{city}」",
self::MASTER_ARTICLE_PUBLISH => "达人「{master}」发布了新攻略「{article}」",
self::SETS_RECOMMEND => "「{photographer}」的套系「{sets}」被太多人喜欢啦"
];
protected $table = "myp_headline";
//解析字符串
protected static function parse($action,$data) {
if (!array_key_exists($action,self::TEMPLATE)) {
return false;
}
$str = self::TEMPLATE[$action];
if (key_exists("photographer",$data)) {
$str = str_replace("{photographer}",$data['photographer'],$str);
}
if (key_exists("sets",$data)) {
$str = str_replace("{sets}",$data['sets'],$str);
}
if (key_exists("article",$data)) {
$str = str_replace("{article}",$data['article'],$str);
}
if (key_exists("city",$data)) {
$str = str_replace("{city}",$data['city'],$str);
}
if (key_exists("master",$data)) {
$str = str_replace("{master}",$data['master'],$str);
}
return $str;
}
//新增
public static function add($action,$data)
{
$str = static::parse($action,$data);
if ($str === false) {
return false;
}
$content = [
'content' => $str,
'type' => $action
];
if (isset($data['target'])) {
$content['target'] = $data['target'];
}
$instance = new self();
return $instance->save($content);
}
}
\ No newline at end of file
......@@ -15,6 +15,9 @@ class ValidatorBase extends Validator
public function validate(array $post)
{
self::$result = self::make($post,$this->validator,$this->message);
if (method_exists($this,"custom_validate")) {
call_user_func_array([$this,"custom_validate"],$post);
}
return self::$result;
}
......
<?php
namespace App\Kw\Model;
use App\Traits\Models;
use Illuminate\Database\Eloquent\Model;
class Keywords extends Model
{
use Models;
protected $table = "myp_kw";
public function __construct(array $attributes)
{
parent::__construct($attributes);
$this->beforeValidationOnCreate();
}
protected function beforeValidationOnCreate()
{
$this->create_time = date("Y-m-d H:i:s",time());
$this->is_del = 0;
$this->sort = 0;
}
public static function getIdByWords($words,$uid = 0,$auto_add = false)
{
$words = trim($words);
$model = self::where("kw_name",$words)->first();
if ($model) {
return $model;
}
if ($auto_add == true) {
$model = new self;
$model->kw_name = $words;
$model->uid = $uid;
$model->follow_count = 0;
$model->used_count = 1;
$model->save();
return $model;
} else {
return false;
}
}
}
\ No newline at end of file
......@@ -32,16 +32,16 @@ class User extends Model
*/
public static function getUserRole($uid)
{
$info = self::getUserInfo($uid,["role"]);
if($info->count() > 0) {
return $info[0]->role;
$info = self::find($uid,["role"]);
if (!$info) {
return false;
}
return false;
return $info->role;
}
public static function getUserInfo($uid,array $fields = self::fields)
{
return self::where("id",$uid)->get($fields);
return self::where("id",$uid)->select($fields)->first();
}
public static function getUserIdsByNickname($nickanme)
......
......@@ -20,6 +20,12 @@ class EventServiceProvider extends ServiceProvider
\App\Sets\Events\SetsEditedEvent::class => [
\App\Sets\Listeners\SetsSearcherListener::class
],
\App\Article\Events\ArtAddEvent::class => [
\App\Article\Listeners\ArtListener::class
],
\App\Article\Events\ArtEditedEvent::class => [
\App\Article\Listeners\ArtListener::class
]
];
/**
......
......@@ -10,7 +10,7 @@ class SetsValidator extends Validator
'city' => 'required',
'card_handle' => 'required',
'alipay_account'=> 'required',
'ex' => 'required,array_length_min:5,array_length_max:5',
'ex' => 'required|array_length_min:5|array_length_max:5',
'styles' => 'required',
'wx_open_id' => 'required',
'introduce' => 'chinese_lenth:2,50',
......
......@@ -26,7 +26,7 @@ class Sets extends \Illuminate\Routing\Controller
* @param shelf int option
* @param
*/
public function lists()
public function index()
{
$query = request()->query();
$where = $this->filter($query);
......@@ -42,7 +42,7 @@ class Sets extends \Illuminate\Routing\Controller
* @method get
* @return array
*/
public function info($id)
public function show($id)
{
try {
$info = SetsModel::findOrFail($id);
......
......@@ -9,10 +9,12 @@
namespace App\Test\Controller;
use App\Article\Model\Art;
use App\Ident\Model\Ident;
use App\Ident\Validation\IdentValidator;
use App\Libraries\Upyun\UpyunClient;
use App\Member\Model\Member;
use App\Member\Model\User;
use App\Sets\Model\Works;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Http\Request;
......@@ -34,11 +36,7 @@ class TestController extends Controller
public function index()
{
$url1 = "http://devyuepai.b0.upaiyun.com/app/4/works/2016-08-24/74ffb5bce0e84651b0f0d1fb1308884c1458dc6f.jpg";
$url2 = "https://devyuepai.b0.upaiyun.com/app/4/works/2016-08-24/74ffb5bce0e84651b0f0d1fb1308884c1458dc6f.jpg";
$sdk = new UpyunClient();
$sdk->del($url1);
$sdk->del($url2);
$k = User::getUserInfo(14,["nickname"])->nickname;
var_dump($k);
}
}
\ No newline at end of file
......@@ -53,4 +53,8 @@ trait Controller
}
return $where;
}
public function csrf(&$data,$key) {
$data[$key] = preg_replace("/<script[^>]*>.*<\/script>/i","",$data[$key]);
}
}
\ No newline at end of file
......@@ -4,7 +4,6 @@ namespace App\Traits;
Trait Models
{
public function getRelate($relations)
{
is_string($relations) && $relations = explode(",",$relations);
......@@ -25,4 +24,5 @@ Trait Models
}
return static::get(["id"])->count();
}
}
\ No newline at end of file
......@@ -7,8 +7,6 @@
*/
namespace App\Works\Listeners;
use App\Works\Events\WorksEditedEvent;
class WorksSearcherListener
......@@ -18,11 +16,11 @@ class WorksSearcherListener
{
$works = $event->model;
$searcher = Search::getSearcher();
if ($works->is_del == 1 || $works->is_hidden == 1 || $works->exists) {
if ($works->is_del == 1 || $works->is_hidden == 1 || $works->exists == false) {
$searcher->del(Search::WORKS,$works->id);
} elseif($works->is_del == 0 && $works->is_hidden == 0) {
$keyworks = array_column($works->relation_keywords()->get(["kw_name"])->toArray(),"kw_name");
$searcher->save(Search::WORKS,$works->id,[
$searcher->save(Search::WORKS , $works->id , [
'works_id' => $works->id,
'name' => $works->name,
'kw' => implode(" ",$keyworks),
......
......@@ -11,12 +11,23 @@ class Details extends Model
use Models;
protected $table = "myp_works_detail";
public static function del($id,$ids)
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
$this->beforeValidationOnCreate();
}
public function beforeValidationOnCreate()
{
$this->create_time = date("Y-m-d H:i:s",time());
}
public static function del($ids)
{
if (!is_array($ids)) {
$ids = explode(",", $ids);
}
$lists = self::where("works_id",$id)->whereIn("id",$ids)->get(['id','works_url']);
$lists = self::whereIn("id",$ids)->get(['id','works_url']);
if ($lists->count() > 0) {
foreach ($lists->toArray() as $detail) {
$detail->delete();
......
......@@ -8,7 +8,7 @@
namespace App\Works\Model;
use App\Details\Model\Details;
use App\Works\Model\Details as DetailModel;
use App\Traits\Models;
use \Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
......@@ -36,6 +36,7 @@ class Works extends Model
$this->is_hidden = 0;
$this->ref_count = 0;
$this->count = 0;
$this->create_time = date("Y-m-d H:i:s",time());
}
public function skipAttributesOnUpdate()
......@@ -72,9 +73,30 @@ class Works extends Model
{
$details = [];
foreach ($resources as $url) {
$details = new Details($url);
$details = new DetailModel($url);
}
return $this->relation_detail()->saveMany($details);
}
public static function newWorks(array $data)
{
$model = new self;
DB::beginTransaction();
try {
$isSaved = $model->fill($data)->save();
if (!$isSaved){
throw new \Exception("保存失败");
}
if (isset($data['images']) && !empty($data['images'])) {
if (!$model->images($data['images'])) {
throw new \Exception("保存图片失败");
}
}
} catch (\Exception $e) {
DB::rollBack();
return false;
}
DB::commit();
return $model;
}
}
\ No newline at end of file
......@@ -7,7 +7,7 @@ use App\Http\Validation\ValidatorBase as Validator;
class WorksValidator extends Validator
{
protected $validator = [
'name' => 'required,chinese_length:2,15',
'name' => 'required|chinese_length:2,15',
'details' => 'array_length_min:5,array_length_max:15',
'uid' => 'required',
];
......
<?php
namespace App\Works\v1\Controller;
use App\Http\Response\HttpStatus;
use App\Http\Response\Response;
use App\Works\Model\Works as WorksModel;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpFoundation\Request;
use App\Works\Model\Details as DetailModel;
class Details extends \Illuminate\Routing\Controller
{
use \App\Traits\Controller;
protected $query_fields = [
"works_id","is_del"
];
/**
* 样片详情列表
* @method get
* @param
* @param uid int option
* @param shelf int option
* @param
*/
public function index($id)
{
$query = request()->query();
$where = $this->filter($query);
$where['works_id'] = $id;
is_null($where) && $where = [];
$row = isset($query["size"])?$query["size"]:config("app.default_perpage");
return Response::success(WorksModel::where($where)->paginate($row)->toArray());
}
/**
* 新建
* @method post
*/
public function store($id,Request $request)
{
$post = $request->all();
try {
$works = WorksModel::findOrFail($id , ["id"]);
$res = $works->images($post);
if ($res) {
return Response::ok();
} else {
return Response::error();
}
} catch (ModelNotFoundException $e){
return Response::error(HttpStatus::HttpNotFound,"样片未找到");
}
}
/**
* 删除
* @method delete
*/
public function destory($ids)
{
$res = DetailModel::del($ids);
if ($res) {
return Response::ok();
} else {
return Response::error();
}
}
}
\ No newline at end of file
......@@ -31,7 +31,7 @@ class Works extends \Illuminate\Routing\Controller
* @param shelf int option
* @param
*/
public function lists()
public function index()
{
$query = request()->query();
$where = $this->filter($query);
......@@ -87,9 +87,8 @@ class Works extends \Illuminate\Routing\Controller
$messages = $validator->getMessages();
return Response::error($messages,HttpStatus::HttpValidationFailed);
}
$model = new WorksModel();
$isSaved = $model->fill($post)->save();
if ($isSaved) {
$model = WorksModel::newWorks($post);
if ($model !== false) {
Event::fire(new WorksEditedEvent($model));
return Response::ok();
} else {
......@@ -102,7 +101,7 @@ class Works extends \Illuminate\Routing\Controller
* @param Request $request
* @method put
*/
public function edit($id,Request $request)
public function update($id,Request $request)
{
try {
$model = WorksModel::findOrFail($id);
......@@ -120,45 +119,10 @@ class Works extends \Illuminate\Routing\Controller
/**
* 删除样片中的一张照片
* $ids 一个或多个works_detail的ID
* @method delete
*/
public function delimage($id,$ids)
{
$res = DetailModel::del($id,$ids);
if ($res) {
return Response::ok();
} else {
return Response::error();
}
}
/**
* 添加照片
* @method post
*/
public function image($id,Request $request)
{
$post = $request->all();
try {
$works = WorksModel::findOrFail($id , ["id"]);
$res = $works->images($post);
if ($res) {
return Response::ok();
} else {
return Response::error();
}
} catch (ModelNotFoundException $e){
return Response::error(HttpStatus::HttpNotFound,"样片未找到");
}
}
/**
* 删除一个样片
* @method delete
*/
public function delete($id)
public function destory($id)
{
try {
$model = WorksModel::findOrFail($id);
......
......@@ -7,15 +7,15 @@ Route::resource ("test" , \App\Test\Controller\TestController::class);
Route::group(["prefix" => "sets", 'namespace' => Provider::getNamespace("sets")],function(){
//套系列表
Route::get ("/" , "Sets@lists");
Route::get ("/" , "Sets@index");
//套系详情
Route::get ("/{id}" , "Sets@info")->where(['id' => '\d+']);
Route::get ("/{id}" , "Sets@show")->where(['id' => '\d+']);
//获取关联信息
Route::get ("/{id}/relation/{relation}" , "Sets@getRelate")->where(['id' => '\d+','relation'=>'\S+']);
//新增套系
/* Route::post("/" , "Sets@newsets");
//编辑套系
Route::put ("/{id}" , "Sets@edit");
Route::put ("/{id}" , "Sets@update");
//软删除套系
Route::delete("/{id}", "Sets@softdelete");
//删除套系
......@@ -27,7 +27,7 @@ Route::group(["prefix" => "sets", 'namespace' => Provider::getNamespace("sets")]
//分类
Route::group(["prefix" => "cates", 'namespace' => Provider::getNamespace("cates")],function(){
//获取所有分类
Route::get ("/" , "Category@lists");
Route::get ("/" , "Category@index");
//获取子分类
// Route::get ("/{id}/child" , "Category@child")->where(['id' => '\d+']) ;
//分类详情
......@@ -35,22 +35,26 @@ Route::group(["prefix" => "cates", 'namespace' => Provider::getNamespace("cates"
});
//分类
//样片
Route::group(["prefix" => "works", 'namespace' => Provider::getNamespace("works")],function(){
//套系列表
Route::get ("/" , "Works@lists");
Route::get ("/" , "Works@index");
//套系详情
Route::get ("/{id}" , "Works@show")->where(['id' => '\d+']);
//获取关联信息
Route::get ("/{id}/relation/{relation}" , "Works@getRelate")->where(['id' => '\d+','relation'=>'\S+']);
Route::get ("/{id}/details" , "Details@index")->where(['id' => '\d+']);
//新增
Route::post("/" , "Sets@newsets");
Route::post("/" , "Works@store");
//编辑
Route::put ("/{id}" , "Works@edit")->where(['id'=>'\d+']);
Route::put ("/{id}" , "Works@update")->where(['id'=>'\d+']);
//删除
Route::delete("/{id}/hard", "Works@delete");
Route::delete("/{id}/hard", "Works@destory");
//删除照片
Route::delete("/{id}/{ids}","Works@delimage")->where(['id' => '\d+','ids'=>'\S+']);
Route::delete("/{ids}/image","Details@destory")->where(['ids'=>'\S+']);
//新增样片里的照片
Route::post("/{id}/image","Details@store");
});
......@@ -68,3 +72,12 @@ Route::group(["prefix" => "user", 'namespace' => Provider::getNamespace("member"
});
//身份认证
Route::group(["prefix" => "art", 'namespace' => Provider::getNamespace("article")],function(){
Route::get("/" , "Article@index")->where(['id' => '\d+']);
Route::put("/{id}" , "Article@update")->where(['id' => '\d+']);
Route::post("/" , "Article@store")->where(['id' => '\d+']);
Route::get ("/{id}/relation/{relation}" , "Article@getRelate")->where(['id' => '\d+','relation'=>'\S+']);
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment