距离OTUS开设新课程“ Framework Laravel”还有几天 。 预期课程的开始,我们将分享作者出版物中有关Laravel基本概念的最后部分。 重要提示:这一系列出版物与本课程的教育计划无关,对初学者来说是有用的材料 。 该课程程序可以在这里找到。
在上
一篇文章中,我们开始编写一个图库,用户可以在其中登录和注册,创建带有说明,封面和标题的相册。 在创建的应用程序中,我们的
view
具有主要价值,现在有必要对其进行一些扩展。
另外,现有代码值得一点改进:
我们已经有两个控制器
AlbumController
和
ImageController
。 添加另一个负责处理字符串的类的导入:
use Illuminate\Support\Str;
并更改负责在我们的数据库中生成随机图像名称的行:
$random_name = Str::random(8);
此外,现在值得更改迁移代码以提高我们的应用程序的可靠性,因为用户必须有权将我们的
description
字段保留为空(否则,带有炸药的Laravel会通知我们错误)。 让我们进入与图像表相关的迁移,然后在此处将与图像描述相关的行更正为该行:
$table->string('description')->nullable();
好了,随着应用程序的“重构”完成。 接下来,您需要完成我们应用程序的外观。 创建一个表单,用户可以在其中创建自己的相册:
addimage.blade.php
文件
@include('includes.header') <body> @include('includes.nav') <div class="container" style="text-align: center;"> <div class="span4" style="display: inline-block; margin-top:100px;"> @if (isset($errors) && $errors->has('')) <div class="alert alert-block alert-error fade in"id="error-block"> <?php $messages = $errors->all('<li>:message</li>'); ?> <button type="button" class="close"data-dismiss="alert">×</button> <h4>Warning!</h4> <ul> @foreach($messages as $message) {{$message}} @endforeach </ul> </div> @endif <form name="createnewalbum" method="POST"action="{{route('create_album')}}" enctype="multipart/form-data"> {{ csrf_field() }} <fieldset> <legend> </legend> <div class="form-group"> <label for="name"> </label> <input name="name" type="text" class="form-control"placeholder=" " value="{{old('name')}}"> </div> <div class="form-group"> <label for="description"> </label> <textarea name="description" type="text"class="form-control" placeholder=" ">{{old('descrption')}}</textarea> </div> <div class="form-group"> <label for="cover_image"> </label> {{Form::file('cover_image')}} </div> <button type="submit" class=«btn btn-default">!</button> </fieldset> </form> </div> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/js/bootstrap.min.js"></script> </body> </html>
让我提醒您,在页面顶部的
includes
中,我们使用了导航和库,最后一部分对此进行了介绍。
另外,我们需要添加
album.blade.php
的外观
@include('includes.header') <body> @include('includes.nav') <div class="container"> <div class="starter-template"> <div class="media"> <img class="media-object pull-left"alt="{{$album->name}}" src="/albums/{{$album->cover_image}}" width="350px"> <div class="media-body"> <h2 class="media-heading" style="font-size: 26px;"> :</h2> <p>{{$album->name}}</p> <div class="media"> <h2 class="media-heading" style="font-size: 26px;"> :</h2> <p>{{$album->description}}<p> <a href="{{route('add_image',array('id'=>$album->id))}}"><button type="button"class="btn btn-primary btn-large"> </button></a> <a href="{{route('delete_album',array('id'=>$album->id))}}" onclick="return confirm(' ?')"><button type="button"class="btn btn-danger btn-large"> </button></a> </div> </div> </div> </div> <div class="row"> @foreach($album->Photos as $photo) <div class="col-lg-3"> <div class="thumbnail" style="max-height: 350px;min-height: 350px;"> <img alt="{{$album->name}}" src="/albums/{{$photo->image}}"> <div class="caption"> <p>{{$photo->description}}</p> <p> : {{ date("d FY",strtotime($photo->created_at)) }}at {{ date("g:ha",strtotime($photo->created_at)) }}</p> <a href="{{route('delete_image',array('id'=>$photo->id))}}" onclick="returnconfirm(' ?')"><button type="button"class="btn btn-danger btn-small"> </button></a> <p> :</p> <form name="movephoto" method="POST"action="{{route('move_image')}}"> {{ csrf_field() }} <select name="new_album"> @foreach($albums as $others) <option value="{{$others->id}}">{{$others->name}}</option> @endforeach </select> <input type="hidden" name="photo"value="{{$photo->id}}" /> <button type="submit" class="btn btn-smallbtn-info" onclick="return confirm(' ?')"> </button> </form> </div> </div> </div> @endforeach </div> </div> <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/js/bootstrap.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> </body> </html>
此外,我们可以稍微更新路由,例如,在
nav.blade.php
:
<li><a href="{{URL::route('create_album_form')}}"> </a></li>
对于更新,更时尚的选择:
<li><a href="{{route('create_album_form')}}"> </a></li>
另一方面,以前的版本适用于6 Laravel。 因此,我们已经有了一种表单,用户可以在其中将照片添加到相册中,并且存在相册的主
view
。 接下来,我们需要添加一个控制器来负责处理单张照片。
因此,我们创建了一个负责处理单个照片的控制器:
php artisan make:controller ImageController
因此,我们内部应该是什么:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\MessageBag; use Validator;

注册和授权
目前,我们的应用程序已准备就绪。 但是,我们仍然需要加强在我们的应用程序中注册,注销和登录现有帐户的能力。
在上一部分中,我们已经显示了
includes/nav.blade.php
外观。 因为 我们希望在用户尚未注册时显示“
登录”和“
按钮,并在用户向我们
时显示“
注销”按钮。
因此,这就是我们现在查看
includes/nav.blade.php
中的列表的
includes/nav.blade.php
:
<ul class="nav navbar-nav"> @if (Auth::check()) <li> <button type="button" class="btn btn-primary"> <!-- , -> --> {{{ Auth::user()->name}}} </button> </li> <li><a href="{{route('create_album_form')}}"> </a></li> @else <!-- --> <li><a href="{{route('register')}}"></a></li> <li><a href="{{route('login')}}"></a></li> @endif @if (Auth::check()) <!-- , --> <!-- --> <li> <a href="{{url('/logout') }}" onclick="event.preventDefault(); document.getElementById('logout-form').submit();"> </a> <form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;"> {{ csrf_field() }} </form> </li> @endif </ul>
使用
Auth::check
构造,
if else
,
if else
使用基本,我们可以在
view
建立更改,具体取决于是否注册了用户。
但是,由于在创建模型和控制器之前对
view
进行了更改,因此我们比引擎先行了一些。 为了进行验证,我们将使用Laravel 6中所有现成的快速解决方案。
因此,关于
用户模型-我们将使用包装盒中随附的模型。 一方面,对于一个完整的应用程序来说显然是不够的,另一方面-我不想将自己局限于一个特定应用程序的范围。 您想要什么样的画廊? 用户在哪里可以创建自己的私人相册,任何人都无法访问? 还是每个人都在哪里分享他们的照片? 我们的应用程序不会受到限制-我认为读者将能够完成它们,而不会对他的口味和颜色造成任何问题。
因此,在Laravel 6中,创建身份验证变得更加容易。 我们转到应用程序的命令行:
composer require laravel/ui —dev
这给了我们必要的包裹。 现在创建:
php artisan ui:auth
这个团队给我们带来什么? 首先,我们在
resources/views
有一个新的
auth
文件夹,在其中,我们具有授权用户和注册用户可能需要的所有
views
:
login
,
register
和
verify
。 还有一个
passwords
子文件夹,专用于重置和恢复密码。 在
Http/Controllers
文件夹中,我们有
HomeController
,在用户注册后需要将其重定向到主页。 我们还将有一个子文件夹
layouts
,其中将包含
app.blade.php
,我们今天将不对其进行分解,但它可以为从头创建的应用程序提供良好的基础。
生成的刀片模板已经具有为
Bootstrap
量身定制的初始布局。 我们已经在
header.blade.php
连接了
header.blade.php
。
另外,我们在
routes/web.php
更新了一些路由。 添加了以下几行:
Auth::routes(); Route::get('/home', 'HomeController@index')->name('home'); Route::post('/logout', 'Auth\LoginController@logout')->name('logout');
home
的路径
home
自动生成的,我进行了重定向以
logout
。
为了使您的布局能在生成的模板上正常运行,我们将其
nav
和
header
到它们:
@include('includes.header') <body> @include('includes.nav') @extends('layouts.app')
太好了,现在一切就绪。 尝试注册。 密码确认也应该起作用:


将来,用户可以选择他想去的服务页面(或者读者可以自己进行重定向,这还不够复杂)。 我们只需要修复一个小细节即可:只有注册和授权的用户才能看到我们的珍贵相册。
为此,我们在路由中添加了一个条件,以便用户登录以访问相册。
更新我们的
web.php
:
Route::get('/', array('as' => 'index','uses' => 'AlbumsController@getList')) ->middleware('auth');; //middleware http Route::get('/createalbum', array('as' => 'create_album_form','uses' => 'AlbumsController@getForm')) ->middleware('auth');; // Route::post('/createalbum', array('as' => 'create_album','uses' => 'AlbumsController@postCreate')) ->middleware('auth');; // Route::get('/deletealbum/{id}', array('as' => 'delete_album','uses' => 'AlbumsController@getDelete')) ->middleware('auth');; // Route::get('/album/{id}', array('as' => 'show_album','uses' => 'AlbumsController@getAlbum')) ->middleware('auth');; //
基本上,在这个阶段我们已经可以完成了。 我将留给读者他想要制作什么应用程序:使用私人相册还是公共相册。 纯粹从理论上讲,如果您避免了注册的可能性并直接在数据库中单独创建用户,则该应用程序已经可以使用-例如,如果您和您的同事打算组织私人相册并且由于某种原因不想使用其他服务。
谢谢大家的关注! 与往常一样,有用的链接: