El libro "Laravel. Guía completa 2da edicion

imagenHola habrozhiteli! ¿Qué diferencia a Laravel de otros frameworks PHP? Velocidad y sencillez. El rápido desarrollo de aplicaciones, un extenso ecosistema y el kit de herramientas Laravel le permiten crear rápidamente sitios y aplicaciones con código limpio y legible.

Matt Staffer, un reconocido maestro y desarrollador líder, ofrece una visión general del marco y ejemplos específicos de cómo trabajar con él. El libro ayudará a los desarrolladores experimentados de PHP a ingresar rápidamente un nuevo tema para implementar un proyecto en Laravel. La publicación también cubre los temas de Laravel Dusk and Horizon, recopila información sobre recursos de la comunidad y otros paquetes que no forman parte del núcleo de Laravel. En este libro encontrará: • Herramientas para recopilar, verificar, normalizar, filtrar datos de usuario • Blade, un potente motor de plantillas personalizadas de Laravel • Modelo ORM expresivo elocuente para trabajar con bases de datos de aplicaciones • Información sobre el papel del objeto Solicitud de iluminación en el ciclo de vida de la aplicación • PHPUnit, Burla y Dusk para probar su código PHP • Herramientas para escribir JSON y RESTful API • Interfaces para acceder al sistema de archivos, sesiones, cookies,cachés y búsqueda • Implementación de colas, trabajos, eventos y publicación de eventos WebSocket

Motor de plantilla de cuchillas


PHP como lenguaje de plantilla funciona relativamente bien. Pero tiene sus inconvenientes, por lo que no puede usar <? Php en línea en todas partes. La mayoría de los marcos modernos tienen su propio lenguaje de plantilla.

Laravel ofrece su propio motor de plantillas Blade basado en el motor .NET Razor. Tiene una sintaxis concisa, es bastante comprensible, acompañado de un modelo de herencia potente e intuitivo y de fácil extensibilidad.

Puede familiarizarse rápidamente con el aspecto de Blade en el Ejemplo 4.1.

Ejemplo 4.1 Ejemplos de cuchillas

<h1>{{ $group->title }}</h1>
{!! $group->heroImageHtml() !!}

@forelse ($users as $user)
       • {{ $user->first_name }} {{ $user->last_name }}<br>
@empty
       No users in this group.
@endforelse

Como puede ver, el código Blade usa llaves para Echo y un acuerdo en el que sus etiquetas de usuario, llamadas "directivas", tienen el prefijo @. Aplicará directivas para todas sus estructuras de administración, así como para la herencia y las funciones personalizadas que desee agregar.

La sintaxis de Blade es limpia y concisa, por lo que trabajar con ella es más fácil y más agradable que con otras alternativas. Pero en el momento en que necesita algo complicado en sus plantillas: herencia anidada, condiciones complejas o recursividad, el motor muestra su mejor lado. Al igual que los mejores componentes de Laravel, simplifica y permite el acceso a los requisitos de aplicaciones pesadas.

Además, dado que toda la sintaxis de Blade se compila en código PHP normal y luego se almacena en caché, es rápido y le permite utilizar PHP nativo en sus archivos de este motor si lo desea. Sin embargo, recomendaría evitar el uso de PHP cuando sea posible; en general, si necesita hacer algo que no es posible con Blade o su directiva de usuario, esto no se aplica a la plantilla.

Visualización de datos


Como puede ver en el ejemplo 4.1, los corchetes {{y}} se usan para ajustar el código PHP que le gustaría mostrar. El código {{$ $ variable}} actúa como <? = $ Variable?> En PHP simple.

Sin embargo, hay una diferencia: Blade protege todas las asignaciones de forma predeterminada con la función PHP htmlentities () para proteger a sus usuarios de pegar scripts maliciosos. Esto significa que {{$ variable}} es funcionalmente equivalente a <? = Htmlentities ($ variable)?>. Si no desea escapar de la salida, use {!!! y en cambio.
{{ }} -

, Blade ({{}}) -. Laravel , Blade Handlebars?

Blade {{ @. , , :

// Blade; $bladeVariable
//
{{ $bladeVariable }}

// @ "{{ handlebarsVariable }}"
//
@{{ handlebarsVariable }}

verbatim( http://bit.ly/2OnrPRP ).

Estructuras de gobierno


La mayoría de las estructuras de control en Blade serán familiares. Muchos duplican directamente el nombre y la estructura de la misma etiqueta en PHP.

Hay algunos ayudantes para mayor comodidad, pero en general las estructuras de control se ven más limpias que en PHP.

Construcciones condicionales


Considere la estructura lógica de la gestión.

@if

La expresión @if ($ condición) en Blade compila a <? Php if ($ condición):?>.más, mássi y terminara si- Con exactamente el mismo estilo de sintaxis en PHP. Eche un vistazo al

Ejemplo 4.2 Ejemplo 4.2. @Simás, mássi y terminara si

@if (count($talks) === 1)
     There is one talk at this time period.
@elseif (count($talks) === 0)
     There are no talks at this time period.
@else
     There are {{ count($talks) }} talks at this time period.
@endif

Al igual que con las expresiones condicionales propias de PHP, puede mezclarlas y combinarlas como desee. No tienen una lógica particular; Hay un analizador con una búsqueda en la forma @if ($ condición) y reemplazo con el código PHP correspondiente.

@unless @endunless

@unless, por otro lado, es una nueva sintaxis que no tiene un equivalente directo en PHP. Esto es lo contrario de @if. @unless ($ condition) es lo mismo que <? php if (! $ condition). Puedes ver esto en el ejemplo 4.3.

Ejemplo 4.3 @unless y @endunless

@unless ($user->hasPaid())
       You can complete your payment by switching to the payment tab.
@endunless

Ciclos


A continuación, considere los ciclos.

@for, @foreach @while

para, para cada y mientrastrabajar en Blade de la misma manera que en PHP (ejemplos 4.4–4.6).

Ejemplo 4.4para y @endfor

@for ($i = 0; $i < $talk->slotsCount(); $i++)
      The number is {{ $i }}<br>
@endfor

Ejemplo 4.5 para cada y @endforeach

@foreach ($talks as $talk)
       • {{ $talk->title }} ({{ $talk->length }} minutes)<br>
@endforeach

Ejemplo 4.6. mientras y @endwhile

@while ($item = array_pop($items))
       {{ $item->orSomething() }}<br>
@endwhile

@forelse @endforelse

paraotra cosa es para cada, que se puede ejecutar incluso si el objeto que está buscando está vacío. Vimos esto en acción al comienzo del capítulo. El ejemplo 4.7 muestra otra opción.

Ejemplo 4.7.paramás

@forelse ($talks as $talk)
       • {{ $talk->title }} ({{ $talk->length }} minutes)<br>
@empty
       No talks this day.
@endforelse

$ LOOP VARIABLE EN DIRECTIVAS PARA CADAY las

directivas @FORELSEpara cada y paraelse (introducido en Laravel 5.3) agrega la variable $ loop, que no está disponible en los bucles foreach de PHP. Cuando se usa dentro de un buclepara cada o paraelse stdClass .

• index — 0 ; 0 — « ».

• iteration — 1 ; 1 — « ».

• remaining — , .

• count — .

• first — , , .

• last — , , .

• depth — «» : 1 , 2 . .

• parent — $loop , foreach; de lo contrario nulo.

Aquí hay un ejemplo de cómo funciona esto:

<ul>
@foreach ($pages as $page)
       <li>{{ $loop->iteration }}: {{ $page->title }}
             @if ($page->hasChildren())
             <ul>
             @foreach ($page->children() as $child)
             <li>{{ $loop->parent->iteration }}
                   .{{ $loop->iteration }}:
                   {{ $child->title }}</li>
             @endforeach
             </ul>
             @endif
       </li>
@endforeach
</ul>

Herencia de plantilla


Blade proporciona un marco de herencia de plantillas que permite que las vistas se expandan, modifiquen e incluyan otras vistas.

Veamos cómo se estructura la herencia con Blade.

Definir secciones de una página utilizando las directivas @ section / @ show y rendimiento


Comencemos con el diseño de Blade de nivel superior, como en el Ejemplo 4.8. Esta es la definición de un envoltorio de página universal en el que luego colocaremos contenido específico de la página.

Ejemplo 4.8. Estructura de la cuchilla

<!-- resources/views/layouts/master.blade.php -->
<html>
       <head>
              <title>My Site | @yield('title', 'Home Page')</title>
       </head>
       <body>
              <div class="container">
                    @yield('content')
              </div>
              @section('footerScripts')
                     <script src="app.js"></script>
              @show
       </body>
</html>

Esto se asemeja a una página HTML normal, pero puede ver el rendimiento en dos lugares (título y contenido), y definimos la sección en el tercero (footerScripts). Aquí tenemos tres directivas de Blade: solorendimiento('contenido'), rendimiento('título', 'Página de inicio') con el valor predeterminado y @ section / @ show con el contenido real.

Aunque se ven un poco diferentes, funcionan esencialmente igual. Los tres determinan que hay una sección con un nombre (el primer parámetro) que se puede expandir más adelante, y qué hacer si la sección no se ha expandido. Lo hacen ya sea con una línea de retorno ('Página de inicio') o sin retorno (simplemente no se mostrará nada si la directiva no se expande) o con el retorno de todo el bloque (en este caso).

¿Cuál es la diferencia? Arendimiento('contenido') sin contenido predeterminado. Además, enrendimiento('título') se mostrará solo si la directiva no se expande. De lo contrario, sus secciones secundarias no tendrán acceso programático al valor predeterminado. @ section / @ show define simultáneamente el valor predeterminado y hace que sus contenidos sean accesibles para sus hijos a través de @parent.

Si tiene dicho diseño principal, puede expandirlo en un nuevo archivo de plantilla, como en el ejemplo 4.9.

Ejemplo 4.9. Extensión de diseño de la cuchilla

<!-- resources/views/dashboard.blade.php -->
@extends('layouts.master')

@section('title', 'Dashboard')

@section('content')
       Welcome to your application dashboard!
@endsection

@section('footerScripts')
      @parent
      <script src="dashboard.js"></script>
@endsection

Esta vista secundaria nos permite mostrarle algunos conceptos nuevos de la herencia de Blade.

@extends

En el ejemplo 4.9, usando @extends ('layouts.master'), determinamos que esta vista no debe mostrarse por sí misma, sino que extiende otra vista. Esto significa que su función es establecer el contenido de varias secciones, pero no trabajar solo. Más como una serie de bloques de contenido que una página HTML. La línea también determina que la vista que extiende se encuentra en resources / views / layouts / master.blade.php.

Cada archivo debe expandir solo otro archivo y la llamada @extends debe ser la primera línea del archivo.

@section @endsection

Usando @section ('title', 'Dashboard') proporcionamos nuestro contenido para la primera sección, title. Como el contenido es muy corto, en lugar de @section y @endsection utilizamos una forma abreviada. Esto le permite pasar contenido como el segundo parámetro @section y luego continuar. Si está un poco confundido con @section sin @endsection, puede usar la sintaxis habitual.

Desde @section ('contenido') en adelante, usamos la sintaxis habitual para definir el contenido de la sección de contenido. Hasta que insertemos un pequeño saludo. Sin embargo, tenga en cuenta: cuando usa @section en una vista secundaria, termina con @endsection (o su aliasdetener) en su lugar show, que está reservado para definir secciones en vistas principales.

@parent

Desde @section ('footerScripts') en adelante, usamos la sintaxis habitual para definir el contenido de la sección footerScripts.

Recuerde que en realidad definimos este contenido (o al menos su "valor predeterminado") ya en el diseño principal. Así que esta vez tenemos dos opciones: sobrescribir el contenido de la vista principal o agregarlo.
Puede ver que tenemos la capacidad de incluir contenido de la vista principal utilizando la directiva @parent dentro de esta sección. De lo contrario, el contenido de la sección se reescribirá completamente con todo lo que se define en el elemento primario de esta sección.

Inclusión de componentes de presentación.


Ahora que hemos descubierto los conceptos básicos de la herencia, se pueden usar algunos trucos más.

@include

¿Qué pasa si estamos en una vista y queremos usar otra? Quizás haya un botón de registro, que es conveniente volver a agregar en todo el sitio. Y tal vez quiero seleccionar el texto del botón cada vez que lo usamos. Eche un vistazo al ejemplo 4.10.

Ejemplo 4.10. Incluir componentes de vista conincluir

<!-- resources/views/home.blade.php -->
<div class="content" data-page-name="{{ $pageName }}">
      <p>Here's why you should sign up for our app: <strong>It's Great.</strong></p>

      @include('sign-up-button', ['text' => 'See just how great it is'])
</div>

<!-- resources/views/sign-up-button.blade.php -->
<a class="button button--callout" data-page-name="{{ $pageName }}">
      <i class="exclamation-icon"></i> {{ $text }}
</a>

incluirlevanta un componente y le transfiere datos (opcional). Tenga en cuenta que no solo puede pasar explícitamente datos para su inclusión a través del segundo parámetroincluir, pero también se refieren a cualquier variable en el archivo incluido que esté disponible para la vista incluida (en este ejemplo, $ pageName). Puede hacer lo que quiera, pero recomendaría que, por claridad, pase siempre cada variable que tiene la intención de aplicar.

También puedes usar directivasincluirSi incluirCuándo y incluirPrimero, como se muestra en el ejemplo 4.11.

Ejemplo 4.11. Incluir vistas condicionales

{{--  ,    --}}
@includeIf('sidebars.admin', ['some' => 'data'])

{{--  ,     true --}}
@includeWhen($user->isAdmin(), 'sidebars.admin', ['some' => 'data'])

{{--        --}}
@includeFirst(['customs.header', 'header'], ['some' => 'data'])

@each

Puede imaginar circunstancias en las que necesita iterar sobre una matriz, una colección y incluirparte para cada artículo. Hay una directiva para esto.cada.

Digamos que tenemos un panel modular lateral y queremos incluir varios módulos con su propio nombre. Eche un vistazo al ejemplo 4.12.

Ejemplo 4.12. Usar componentes de vista en un bucle concada

<!-- resources/views/sidebar.blade.php -->
<div class="sidebar">
      @each('partials.module', $modules, 'module', 'partials.empty-module')
</div>

<!-- resources/views/partials/module.blade.php -->
<div class="sidebar-module">
      <h1>{{ $module->title }}</h1>
</div>

<!-- resources/views/partials/empty-module.blade.php -->
<div class="sidebar-module">
      No modules :(
</div>

Considere la sintaxis cada. El primer parámetro es el nombre del componente de la vista. El segundo es una matriz o colección para la iteración. Tercero, el nombre de la variable bajo la cual cada elemento (en este caso, cada elemento en la matriz $ modules) se pasará a la vista. Y el cuarto parámetro opcional es una vista que muestra si la matriz o colección está vacía (o si lo desea, puede pasar una cadena aquí que se usará como plantilla).

Usando pilas


La plantilla general es quizás difícil de administrar con el Blade básico, cuando cada vista en la jerarquía de Blade necesita agregar algo a una sección específica, de manera muy similar a agregar una entrada a una matriz.

La situación más común es cuando ciertas páginas (y, en ocasiones, en un sentido más amplio, ciertas secciones del sitio) tienen archivos CSS y JavaScript únicos específicos que necesitan cargar. Imagine que tiene un archivo CSS "global" para todo el sitio, un archivo CSS para la sección de trabajo y un archivo CSS para la página "Obtener un trabajo".

Las pilas de cuchillas están hechas para eso. En la plantilla principal, defina una pila de marcador de posición. Luego, en cada plantilla secundaria, puede "insertar" registros allí utilizandoempujar/ @ endpush, que los agrega al final de la pila en la imagen final. También puede usar @ prepend / @ endprepend para agregarlos al principio. El ejemplo 4.13 ilustra esto.

Ejemplo 4.13. Usando pilas de cuchillas

<!-- resources/views/layouts/app.blade.php -->
<html>
<head><!--  --></head>
<body>
       <!--    -->
       <script src="/css/global.css"></script>
       <!-- ,       -->
       @stack('scripts')
</body>
</html>

<!-- resources/views/jobs.blade.php -->
@extends('layouts.app')

@push('scripts')
        <!--  -    -->
        <script src="/css/jobs.css"></script>
@endpush

<!-- resources/views/jobs/apply.blade.php -->
@extends('jobs')

@prepend('scripts')
       <!--  -    -->
       <script src="/css/jobs--apply.css"></script>

@endprepend

Esto conduce al siguiente resultado:

<html>
<head><!--  --></head>
<body>
       <!--    -->
       <script src="/css/global.css"></script>
       <!-- ,       -->
       <script src="/css/jobs--apply.css"></script>
       <script src="/css/jobs.css"></script>
</body>
</html>

Usando componentes y ranuras


Laravel ofrece otra plantilla para incluir contenido entre vistas, que se introdujo en 5.4: componentes y ranuras. Los primeros son más efectivos en contextos cuando usas vistas de componentes y les pasas grandes porciones de contenido como variables. Mire el Ejemplo 4.14 para ver una ilustración de un modelo o información sobre herramientas que podría alertar al usuario de un error u otra acción.

Ejemplo 4.14. Una ventana modal es un mal ejemplo de una vista de componente

<!-- resources/views/partials/modal.blade.php -->
<div class="modal">
      <div>{{ $content }}</div>
      <div class="close button etc">...</div>
</div>

<!--    -->
@include('partials.modal', [
       'body' => '<p>The password you have provided is not valid. Here are the rules
       for valid passwords: [...]</p><p><a href="#">...</a></p>'
])

Esto es demasiado para una variable así y es ideal para un componente.

Los componentes con ranuras son componentes de vistas que están diseñados para incluir grandes porciones ("ranuras") para recuperar contenido de una plantilla incluida. El ejemplo 4.15 muestra cómo realizar ingeniería inversa del código del ejemplo 4.14 utilizando componentes y ranuras.

Ejemplo 4.15. Ventana modal como componente más adecuado con ranuras

<!-- resources/views/partials/modal.blade.php -->
<div class="modal">
      <div>{{ $slot }}</div>
      <div class="close button etc">...</div>
</div>

<!--    -->
@component('partials.modal')
        <p>The password you have provided is not valid.
        Here are the rules for valid passwords: [...]</p>

        <p><a href="#">...</a></p>
@endcomponent

Como puede ver en el ejemplo 4.15, la directiva componentele permite extraer nuestro código HTML de una cadena comprimida de una variable y vuelve al espacio de la plantilla. La variable $ slot en la plantilla de nuestro componente recibe cualquier contenido transferido acomponente.

Ranuras compuestas


El método que utilizamos en el ejemplo 4.15 se llama la ranura "predeterminada"; todo lo que pasas entrecomponentey @endcomponent, pasado a la variable $ slot. Pero también puede tener más que solo una ranura predeterminada. Imagine una ventana modal con un título, como en el ejemplo 4.16.

Ejemplo 4.16. Componente de una representación modal con dos variables.

<!-- resources/views/partials/modal.blade.php -->
<div class="modal">
      <div class="modal-header">{{ $title }}</div>
      <div>{{ $slot }}</div>
      <div class="close button etc">...</div>
</div>

Puedes usar la directiva espacio en sus desafíos componentepara transferir contenido a ranuras que no sean las predeterminadas, como se muestra en el Ejemplo 4.17.

Ejemplo 4.17. Transferir más de una ranura a un componente

@component('partials.modal')
        @slot('title')
               Password validation failure
        @endslot

        <p>The password you have provided is not valid.
        Here are the rules for valid passwords: [...]</p>

        <p><a href="#">...</a></p>
@endcomponent

Y si, en su opinión, hay otras variables que no tienen sentido como un espacio, aún puede pasar una matriz de contenido como el segundo parámetro para componente igual que con incluir. Eche un vistazo al ejemplo 4.18.

Ejemplo 4.18. Pasar datos a un componente sin ranuras

@component('partials.modal', ['class' => 'danger'])
         ...
@endcomponent

Nombrar un componente como directiva


Hay un truco para simplificar los componentes de la llamada: alias. Simplemente llame a Blade :: component () en la fachada de Blade, el más común es el método de arranque AppServiceProvider (), y pásele la ubicación del componente y luego el nombre de la directiva deseada, como se muestra en el Ejemplo 4.19.

Ejemplo 4.19. Seudonimizar un componente como directiva

// AppServiceProvider@boot
Blade::component('partials.modal', 'modal');

<!--   -->
@modal
         Modal content here
@endmodal


»Se puede encontrar más información sobre el libro en el sitio web del editor
» Contenido
» Extracto de

Khabrozhiteley 25% de descuento en el cupón - Laravel

Tras el pago de la versión en papel del libro, se envía un libro electrónico por correo electrónico.

All Articles