Как очистить скомпилированный вид для определенного шаблона блейда

#laravel-5 #laravel-views

#laravel-5 #laravel-просмотры

Вопрос:

PHP artisan view: команда clear очищает все скомпилированные представления в приложении. Как очистить скомпилированный вывод для определенного вида.

Ответ №1:

Простой ответ: напишите свою собственную команду.

С чего мне начать?Прежде всего, вы должны знать, что скомпилированные представления имеют другие имена, чем исходные блейд-представления.

Какие имена у них есть? Laravel вызывает sha1() по полному пути к файлу. Так, например. Имя скомпилированного файла layouts/app.blade.php (поставляется с установкой по умолчанию).

в версиях менее 5.2 вместо sha1() используется md5(),

 5.2, 5.3 => sha1()
5.1, 5.0, 4.2, 4.1, 4.0 => md5()
  

Предполагая, что ваша версия > = 5.2

 sha1('C:xampphtdocsmyappresourcesviews/layouts/app.blade.php');
  

Таким образом, имя файла будет9407584f16494299da8c41f4ed65dcb99af82ae2.php

Как мне это сделать тогда?

  • Создайте новую команду, которая принимает filename в качестве аргумента.
  • Добавьте путь просмотра для имени файла в функции fire(). Как я показывал вам ранее C:xampphtdocsmyappresourcesviews (просмотреть полный путь) /layouts/app.blade.php (имя файла)

$path = 'C:xampphtdocsmyappresourcesviews' . '/layouts/app.blade.php';

  • $path = sha1($path) . '.php'; Чтобы получить скомпилированное имя файла.
  • Проверьте, существует ли имя файла в каталоге скомпилированных представлений
  • Удалите файл, если он существует

Команда, в которой вы получите что-то вроде,

Примечание: Если у вас разные пути просмотра (изменены значения по умолчанию), вы должны внести изменения в мой приведенный ниже код.

 <?php
namespace AppConsoleCommands;
use IlluminateConsoleCommand;
use RuntimeException;
class RemoveCompiled extends Command
{
    protected $signature = 'view:clearOne {file}';
    protected $description = 'Remove one compiled view!';
    public function handle()
    {
        $path = sha1($this->laravel['config']['view.paths'][0] . '/' . $this->argument('file'));
        $f =  $this->laravel['config']['view.compiled'] . '\'. $path . '.php';
        if(!file_exists($f))
            return; //do whatever you want
        if(unlink($f))
            echo "File deleted!";
    }
}
  

Вызов: php artisan view:ClearOne layouts/app.blade.php

Комментарии:

1. Спасибо, похоже, это сработает, но моя проблема в чем-то другом, я разработал пользовательскую директиву блейда и возвращаю из нее какую-то динамическую строку, скажем, некоторые значения, запрашиваемые БД, теперь, что происходит, блейд, в который я добавил свою пользовательскую директиву, не отражает новые значения из БД, если я не очищу скомпилированное представление для этого представления (которое содержит пользовательскую директиву), я думаю, было бы не очень хорошей идеей каждый раз очищать все скомпилированные представления.

2. @harish Вы вызываете команды artisan в коде. Итак, давайте посмотрим, вы запрашиваете и возвращаете вид с результатом запроса. перед возвратом представления. вы можете вызвать artisan тем же методом. а затем верните вид.

3. Да, я понял, но это единственный способ? Потому что тогда, я думаю, для каждого http-запроса мои представления будут скомпилированы заново… повлияет ли это на производительность приложения

4. @harish «это единственный способ», который вызовет новый вопрос, далекий от «Как мне удалить одно скомпилированное представление вместо всех представлений».

5. Да, согласен.. Спасибо, я ценю ваше время и входные данные (y)