#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)