Laravel Nova å ¥é¨å建ä¸ä¸ªç®åçå客(ä¸)
Nova æ¯ä»ä¹æå°±ä¸å¤è¯´äºï¼åæ£ç¨è¿ä»¥åå°±ä¸ä¼åå»ç¨å«çåå°æ¡æ¶äºã
ä¸é¢æå°ç¨ä¸ç³»åæç« æ¥å®è·µå®è·µnovaï¼æä»ä¹é®é¢æ¬¢è¿å¤§å®¶æç¹äº¤æµã
å ¥é¨
é¦å
ä½ å¿
é¡»å°nova
çå®ç½ 注å ä¸ä¸ªè´¦å·ã
䏿¦æ³¨å好äºï¼ä½ å¿
须买ä¸ä¸ª license æ¥ç¨nova
ç代ç ï¼è¿ä¸ªæå°±ä¸æ¼ç¤ºäºã
å¼åè
æ¯ 99ç¾éï¼å¢éæ¯ 199ç¾éãæ¿ææ¯æä½è
çï¼å欢nova
çæè§å¾é½è¦å»ä¹°ä¸ä¸ï¼æå¥½ä¸è¦ä»å«äººæéä¹°ï¼å 为ç¨åºè¦æ¯çç¹åé¨ä»ä¹çé£å°±å¾ä¸å¿å¤±äºã
买好 license åï¼å°±ænova
ä¸è½½å°ä½ èªå·±ççµèä¸ã
ä¸ä¸æ¥ï¼å建ä¸ä¸ªé¡¹ç®:ä¸é¢ä¸¤ä¸ªå½ä»¤é便ç¨åªä¸ª
laravel new <your-project-name>
composer create-project laravel/laravel <your-project-name>
æä¹ æ¯ç¨ç¬¬äºä¸ªï¼è¿å¯ä»¥æå®laravelççæ¬ï¼æ´éè¦çæ¯éåº¦æ¢æå½å
æºè¶
å¿«ã
å建好äºé¡¹ç®åænova
ç®å½ç´æ¥ç§»å¨å°ä½ 项ç®çæ ¹ç®å½ï¼å
¶ä»ç®å½ä¹è¡ï¼
项ç®å®è£
é
ç½®ä½ ç composer.json
æ¥è¯å« Novaï¼
"repositories": [
{
"type": "path",
"url": "./nova"
}
],
ç¶åæ Nova æ·»å å° composer.json
çrequire
å¦ä¸ï¼
"require": {
"php": "^7.1.3",
"fideloper/proxy": "^4.0",
"laravel/framework": "5.6.*",
"laravel/nova": "*"
},
è¿è¡å®è£
å½ä»¤åå
å¨ .env
æä»¶éé¢é
ç½®ä¸æ°æ®åºä¿¡æ¯ãåä¸å
é
置好ï¼è¦ä¸ç¶åºéäºå°±é¾åäºã
使ç¨ä¸é¢çå½ä»¤å¨ terminal éå®è£
Nova:
ï¼ç¨windowsçæåæå°±ä¸ç¥éæä¹å¼äºï¼èªå·±ç ç©¶ï¼
composer update
php artisan nova:install
php artisan migrate
好äºï¼ç°å¨æä»¬å¼å§è®¿é® /nova
è·¯ç±ççå®çç»éç颿ã
æ·»å 第ä¸ä¸ªç¨æ·
为äºç»å½æä¹æ¯æ¼äºï¼å¨ç»ç«¯ç¨è¿ä¸ªå½ä»¤ php artisan nova:user
å建æä»¬çç³»ç»ã
æä»¬æ¥å»ºä¸ªå客ç©ç©
让æä»¬å建å
¶ä»laravel项ç®ä¸æ ·å建è¿ä¸ªå客æã ç¨ php artisan make:model Post -a
ç»æä»¬çå客å建 Post 模åãç°å¨è®©æä»¬æ¥å建è¿ç§»æä»¶ï¼å äºå段ã
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id');
$table->text('title');
$table->text('subtitle');
$table->text('body');
$table->dateTime('published_on');
$table->timestamps();
});
}
è¿è¡ php artisan migrate
æè¡¨å å°æ°æ®åºéé¢ãåå®åè¿å
¥ Post.php
æä»¶é
置模åå
³ç³»ã
注æä¸æä»¬æ£ç¡®è®¾ç½®ä¸ä¸ªdatetime
åã
çä¸ Post.php
æä»¶å¦ä¸ï¼
class Post extends Model
{
protected $dates = [
'published_on',
];
public function user()
{
return $this->belongsTo('App\User');
}
}
ç°å¨æä»¬å¨ User 模åéé¢å®ä¹åè½¬å ³ç³»ã
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
public function posts()
{
return $this->hasMany('App\Post');
}
}
好äºï¼åå®è¿äºï¼å©ä¸çå°±æ¯è¯¥åNovaæ¹é¢çäºäºã
ä½¿ç¨ Nova
使ç¨nova
çæ¶åå
çä¸å®ç resourcesçèµææãä½ æ³ç¨nova
管ççæ¯ä¸ªæ¨¡åå¨novaéé¢é½æä¸ä¸ªç¸åºç resource
ã
为äºçæ Post ç resource
æä»¬è¿è¡nova:resource Post
å½ä»¤ãç°å¨çä¸ä½ çapp\Nova
ç®å½ï¼æ¯ä¸æ¯å¤äºäºä»ä¹ï¼
æ¯å§ï¼é»è®¤ User resource å·²ç»å¨éé¢äºï¼ç°å¨å¤åºæ¥çæ¯ä½ åæå建ç Post Resource ï¼ä½ è¦é
ç½®ç大é¨åånova
ç¸å
³çä¸è¥¿é½ä¼å¨è¿éè¿è¡ç®¡çã
好äºï¼ç°å¨æä»¬åå¤å¼å§åä¸äº CRUD çæä½ï¼åä¹åæä»¬éè¦å¨æä»¬ç Post Resource é颿·»å ä¸äºfield()
ãè¿å°±æ¯åè¯æä»¬çnova
æä»¬çæ¨¡åæ¯å¦ä½å®ä¹æä»¬è¡¨çåæ®µçã
Nova æ 许å¤ä¸åç åæ®µç»æä»¬ç¨ï¼æ²¡äºå¤ççææ¡£æãæè¿éå°±ç¨äºç®åçå§ï¼
public function fields(Request $request)
{
return [
ID::make()->sortable(),
BelongsTo::make('User')->rules('required'),
Text::make('Title')->rules('required')->sortable(),
Text::make('Subtitle')->rules('required')->hideFromIndex(),
Markdown::make('Body')->rules('required'),
DateTime::make('Published On')->rules('required'),
];
}
æä»¬éè¿ subtitle
è¿ä¸ªå段æ¥è§£éä¸ field å°åºæ¯å¹²ä»ä¹çã
Text::make('Subtitle')->rules('required')->hideFromIndex(),
Text
åè¯æä»¬è¦çæä»ä¹ç±»åçåæ®µãç¶åè¿ä¸ªæ ç¾å°±æ¯æä»¬ä¼ éç» make()
éææ¹æ³çãæ ç¾éè¦æè形忳å»å¹é
æ°æ®è¡¨éçåã
æä»¬ä¹å¯ä»¥ä½¿ç¨ rules()
æ¹æ³å ä¸äºéªè¯ã æ¬ä¾ä¸ï¼æä»¬éªè¯ Subtitle
æ¯ä¸ä¸ªå¿
å¡«åæ®µã
æå, æä»¬è¦è°æ´ä¸å段 æ¾ç¤º çåºåï¼ç¨hideFromIndex()
æ¹æ³å°±è¡ãè¿ä¼é»æ¢å段å¨å表页æ¾ç¤ºã å½ç¶æäºå段å¤çèµ·æ¥æç¹ä¸ä¸æ ·ï¼(i.e. Markdown
)ãå½ç¶ï¼å¤§å¤æ°æ¶åï¼å¦æä½ ä¸ç¨éèæ¹æ³ï¼åªéé½ä¼æ¾ç¤ºè¯¥å段ã
å°±è¿ä¹ç®åï¼æä»¬æå»ºäºæä»¬åå®¢çæ´ä¸ªCMSã 妿æä»¬åå°æ§å¶å°ï¼æä»¬å°±å¯ä»¥çå°ä¸ä¸ªæ°çPosts
èåäºï¼ä½äºResources
ä¸é¢ï¼ã
ç¹å»ä¸ä¸ Postsççé¦é¡µé½æ¾ç¤ºä¸ªå¥ï¼
æä»¬å¼å§å建ä¸ç¯æç« ãç¹å»Create Post
å建ã
妿æä»¬ç´æ¥ç¹æäº¤ï¼ä»ä¹é½ä¸è¾å ¥çè¯ï¼ä½ å°±ä¼çå°å¾å¤éªè¯çé误æç¤ºã
䏿¦æä»¬æ£å¸¸æäº¤ï¼ä½ å°±å¯ä»¥åæ¢å°æç« ç详æ 页ççäºã
æååå°æç« çé¦é¡µï¼åç§ç§ä»ä¹æ ·ï¼åæå建çæç« æ¯ä¸æ¯å¨å表ä¸äºï¼ååã
å°±è¿æ ·ï¼æä»¬ä¸ºå客æå»ºäºä¸ä¸ªCMSã
ç°å¨ï¼è½ç¶è¿æ ·å¯ä»¥è§£å³ç®¡çæ¹é¢çé®é¢ï¼ä½æä»¬ä»ç¶éè¦è®©æä»¬çç¨æ·å¯ä»¥æ¥çæä»¬çå¸åã
该æä¹åå¢ï¼
åå° Laravel
为äºå®æè¿ä¸ªå客系ç»ï¼æä»¬è¿å
¥ PostController
æ§å¶å¨å¹¶ä¸è®¾ç½®ä¸äºè§å¾ãæ¬ä¾ä¸æåªå
³index()
åshow()
ï¼æä»¥å
æå
¶ä»çæ¹æ³å æå§ï¼ææ¯å¤©è座ï¼è²ä¼¼ä¹æç¹å¼ºè¿«çã
ç°å¨ï¼æä»¬å°å¿«éè·åæ£ç¡®çæ°æ®å¹¶å°ç¨æ·åéå°ä¸äºæ°è§å¾ã
class PostController extends Controller
{
public function index()
{
$posts = Post::orderByDesc('published_on')->get();
return view('posts', compact('posts'));
}
public function show(Post $post)
{
return view('post', compact('post'));
}
}
ä¸é¢æä»¬è¿å
¥ web.php
æä»¶æ¥å®ä¹æä»¬çè·¯ç±ï¼å¦ä¸ï¼è®°å¾æä»¥åç代ç å æï¼ï¼
Route::get('/', '[email protected]');
Route::get('/posts/{post}', '[email protected]');
æåéå½å welcome.blade.php
为 posts.blade.php
. æä»£ç æ¹æä¸é¢è¿æ ·ç:
<!doctype html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
<!-- Fonts -->
<link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet" type="text/css">
<!-- Styles -->
<style>
html, body {
background-color: #fff;
color: #636b6f;
font-family: 'Nunito', sans-serif;
font-weight: 200;
height: 100vh;
margin: 0;
}
.m-b-md {
display: block;
margin-bottom: 60px;
}
</style>
</head>
<body>
<div>
@foreach($posts as $post)
<a href="/posts/{{$post->id}}" class="m-b-md">
<h1>{{$post->title}}</h1>
<h3>{{$post->subtitle}}</h3>
<h4>{{$post->published_on}}</h4>
</a>
@endforeach
</div>
</body>
</html>
ç°å¨è®©æä»¬åå¸ä¸äºåææï¼é便è¾å ¥ã
æåï¼å¤å¶posts.blade.php
æä»¶å¹¶ä¸éå½å为 post.blade.php
ãæéé¢çä»£ç æ¹æä¸é¢çï¼
<!doctype html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
<!-- Fonts -->
<link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet" type="text/css">
<!-- Styles -->
<style>
html, body {
background-color: #fff;
color: #636b6f;
font-family: 'Nunito', sans-serif;
font-weight: 200;
height: 100vh;
margin: 0;
}
</style>
</head>
<body>
<div>
<h1>{{$post->title}}</h1>
<h3>{{$post->subtitle}}</h3>
<h4>Written by {{$post->user->name}} on {{$post->published_on}}</h4>
</div>
<article>{{$post->body}}</article>
</body>
</html>
çä¸æï¼æä»¬ç»äºå¯ä»¥çå°æ¯ç¯æç« ç详ç»å 容äºã
æ»ç»
æä¸ç¥éä½ æ¯ååçï¼ä½æ¯è¿æ¯æç¨è¿çæå¿«çå建ä¸ä¸ªå客çåæ³ãï¼èå¤å°±å欢çè¯´ï¼æé½æ¯ç´æ¥ç¨å¼æºå客ç¨åºï¼ãä¸è¿ï¼nova
ççæ²¡å¾è¯´ã
好äºï¼è¿æ¬¡å
å°è¿ï¼ä¸ä¸ç¯æç« ç»§ç»ã
2 thoughts on âLaravel Nova å ¥é¨å建ä¸ä¸ªç®åçå客(ä¸)â
Pingback:Leijingwei's
Everything is very open with a precise clarification of the issues.
It was definitely informative. Your site is extremely helpful.
Thanks for sharing!
ReplyLeave a Reply Cancel reply
Your email address will not be published. Required fields are marked *
Comment
Name *
Email *
Website